Редактирование фото пользователя на Django, необходимо передать request.POST + request.FILES вместе - PullRequest
0 голосов
/ 13 марта 2020

Я немного застрял здесь, кодирую newb ie и работаю над моим первым Django проектом с нуля. Посмотрел пару ответов и попробовал пару вещей, но все еще не работает. Я пытаюсь разрешить пользователь, чтобы редактировать свою фотографию. Я выяснил, как разрешить им загружать его при регистрации, и я знаю, что он имеет дело с 'request.FILES', но я не могу понять, как включить его в значение формы для редактирования профиля. Это ошибка, которую я получаю

AttributeError at /update_account/10/
'Profile' object has no attribute 'get'
Request Method: POST
Request URL:    http://localhost:8000/update_account/10/
Django Version: 3.0
Exception Type: AttributeError
Exception Value:    
'Profile' object has no attribute 'get'
Exception Location: /Users/papichulo/Desktop/DatingApp/11_env/lib/python3.7/site-packages/django/utils/functional.py in inner, line 225
Python Executable:  /Users/papichulo/Desktop/DatingApp/11_env/bin/python
Python Version: 3.7.3
Python Path:    
['/Users/papichulo/Desktop/DatingApp',
 '/Library/Frameworks/Python.framework/Versions/3.7/lib/python37.zip',
 '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7',
 '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/lib-dynload',
 '/Users/papichulo/Desktop/DatingApp/11_env/lib/python3.7/site-packages']
Server time:    Fri, 13 Mar 2020 04:30:40 +0000

вот мое представление update_account:

def update_account(request, profile_id):
    #Edit an existing profile 

    profile = request.user


    if request.method != 'POST':
        #Initial request; prefil form with current entry
        update_form = ProfileUpdateForm(instance=profile)
    else:
        #POST data submitted;process data. 
        update_form = ProfileUpdateForm(profile, request.POST, request.FILES)
        if update_form.is_valid():
            update_form.save()
            return HttpResponseRedirect(reverse('dating_app:profile', args=[profile.id]))

    context = {'profile' : profile, 'update_form' : update_form}
    return render(request, 'dating_app/update.html', context)

Вот мой form.py, который включает в себя Форма для регистрации и обновления:

from django import forms
from django.contrib.auth.forms import UserCreationForm

from dating_app.models import Profile




class RegistrationForm(UserCreationForm):


    class Meta:
        model = Profile 
        fields = ("username","email","description","photo","password1","password2")





class ProfileUpdateForm(forms.ModelForm):

    class Meta:
        model = Profile 
        fields = ('username','description','photo')


    def clean_username(self):
        user = self.user
        if self.is_valid():
            username = self.cleaned_data['username']
            #makes sure no two users have same username
            try:
                profile = Profile.objects.exclude(pk=self.instance.pk).get(username=username)
            except Profile.DoesNotExist:
                return username
            raise forms.ValidationError('Username "%s" is already in use. Please pick another username!' % profile.username)

    def clean_description(self):
        if self.is_valid():
            #doesn't matter if descriptions are the same
            description = self.cleaned_data['description']
            return description


    def clean_photo(self):
        if self.is_valid():
            photo = self.cleaned_data['photo']
            return photo

И обновление. html:

{% extends "dating_app/base.html" %}

{% block content %}
<br>

<h1>Update Profile</h1>


    <form action="{% url 'dating_app:update_account' user.id %}" method='post' enctype="multipart/form-data">
        {% csrf_token %}
        {% for field in update_form %}
            <p>
                {{field.label_tag}}
                {{field}}

                {% if field.help_text %}
                    <small style="color:grey;">{{field.help_text}}</small>
                {% endif %}

                {% for error in field.errors %}
                    <p style="color: red;">{{error}}"</p>
                {% endfor %}
            </p>
        {% endfor %}
        <button type="submit">Save Changes</button>
    </form>


{% endblock content %}

Заранее большое спасибо !!

1 Ответ

0 голосов
/ 13 марта 2020

в вашем views.py

def update_account(request, profile_id):
    #Edit an existing profile 

    profile = request.user


    if request.method != 'POST':
        #Initial request; prefil form with current entry
        update_form = ProfileUpdateForm(instance=profile)
    else:
        #POST data submitted;process data. 
        update_form = ProfileUpdateForm(instance = profile,data= request.POST, files= request.FILES)
        if update_form.is_valid():
            update_form.save()
            return HttpResponseRedirect(reverse('dating_app:profile', args=[profile.id]))

    context = {'profile' : profile, 'update_form' : update_form}
    return render(request, 'dating_app/update.html', context)
...