MyGear - Avatar-Bild
Nachdem das Benutzerprofil steht, muss ein Avatar-Bild her. In den Models der Accounts-App ist ja schon alles vorbereitet. Hier kommt aber noch eine Funktion dazu, damit jeder User seinen eigenen Ordner erhält. Diese nutze ich später noch einmal, um Bilder der Ausrüstung im User-Ordner zu speichern.
def get_upload_path(instance,filename):
folder=instance.user.email.replace('@','')
return f'users/{folder}/{filename}'
Und eine, die prüft, ob der Dateiname schon existiert:
class OverwriteStorage(FileSystemStorage):
def get_available_name(self, name, max_length=None):
if self.exists(name):
os.remove(os.path.join(settings.MEDIA_ROOT, name))
return name
In der Klasse MyUser ändert sich dann eine Zeile:
avatar=models.ImageField(storage=OverwriteStorage(),upload_to=get_upload_path,null=True,blank=True)
In der forms.py übernehmen wir das:
class AvatarForm(forms.ModelForm):
class Meta:
model=MyUser
fields=['avatar']
In der urls.py kommt die URL für das Upload-Formular dazu:
path('upload_avatar/', upload_avatar, name='upload_avatar'),
Das Formular ist wieder ganz einfach:
{% extends 'home.html' %}
{% block title %}Upload Avatar{% endblock %}
{% block content %}
<h2>Upload Avatar</h2>
<form method="post" enctype="multipart/form-data">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Upload</button>
</form>
{% endblock %}
Und dann noch die views.py, damit auch was angezeigt wird:
def upload_avatar(request):
if request.method=="POST":
old_avatar=MyUser.objects.get(email=request.user)
form=AvatarForm(request.POST,request.FILES,instance=old_avatar)
if form.is_valid:
if old_avatar.avatar:
avatar_path=old_avatar.avatar.path
if os.path.exists(avatar_path):
os.remove(avatar_path)
user=form.save(commit=False)
user.user=old_avatar
user.save()
return render(request, 'user_profile.html', {'user':request.user,'display_name':get_display_name(request)})
else:
form=AvatarForm()
return render(request, 'upload_avatar_form.html', {'form':form,'display_name':get_display_name(request)})
→