MyGear - Avatar-Bild

- Veröffentlicht unter Programmieren von - Permalink

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)})
Schlagworte: