Django просмотр требует, чтобы элемент не был в форме - PullRequest
0 голосов
/ 05 марта 2020

Я расширил пользовательскую модель Django некоторыми дополнительными полями

models.py

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    telephone = models.CharField(max_length=15, blank=True)
    date_of_birth = models.DateField(null=True, blank=True)

forms.py

class UserForm(forms.ModelForm):
    class Meta:
        model = User
        fields = ('first_name', 'last_name', 'email')

class ProfileForm(forms.ModelForm):
    class Meta:
        model = Profile
        fields = ('telephone', 'date_of_birth')
        widgets = {
            'date_of_birth': forms.DateInput(attrs={'type': 'date'}),
        }

user_update. html

<form action="/user-updated/{{ user.pk }}/" method="post">
    {% csrf_token %}
    <table>
        <tr><td>User:</td><td>{{ user.username }}</td></tr>
        <tr><td>First Name:</td><td>{{ user_form.first_name }}</td></tr>
        <tr><td>Last Name:</td><td>{{ user_form.last_name }}</td></tr>
        <tr><td>Email:</td><td>{{ user_form.email }}</td></tr>
        <tr><td>Telephone:</td><td>{{ profile_form.telephone }}</td></tr>
        <tr><td>Date of birth:</td><td>{{ profile_form.date_of_birth }}</td></tr>
    </table>
    <input type="submit" value="Submit" />
</form>

views.py

form(request, user_pk):
    user = User.objects.get(pk=user_pk)
    if request.method == 'POST':
        user_form = UserForm(request.POST, instance=request.user)
        profile_form = ProfileForm(request.POST, instance=request.user.profile)
        print(profile_form.errors)
        if user_form.is_valid() and profile_form.is_valid():
            profile, created = Profile.objects.get_or_create(user=request.user)
            user_form.save()
            profile_form.save()
            messages.success(request, ('Your profile was successfully updated!'))
            date_of_birth = profile_form.cleaned_data['date_of_birth']
            user = profile_form.cleaned_data['user']

            context = {'user': user,}
            template = loader.get_template('user_updated.html')

            return HttpResponse(template.render(context, request))
        else:
            messages.error(request, ('Please correct the error below.'))
    else:
        user_form = UserForm()
        profile_form = ProfileForm()
    context = {'user': user,
               'user_form': user_form,
               'profile_form': profile_form
               }
    return render(request, 'user_details.html', context)

После отправки profile_form выдает ошибку в views.py:

<ul class="errorlist"><li>user<ul class="errorlist"><li>This field is required.</li></ul></li></ul>

Форма выглядит следующим образом

enter image description here

Может кто-нибудь подсказать, как я может исправить это?

1 Ответ

1 голос
/ 05 марта 2020

попробуй вот так

def form(request): #changed here
 if request.method == 'POST':
    instance = get_object_or_404(Profile, user=request.user) #added

    user_form = UserForm(request.POST, instance=request.user) 
    profile_form = ProfileForm(request.POST, instance=instance) #edited

    if user_form.is_valid() and profile_form.is_valid():
        user_form.save()

        profile_form.save(commit=False) #try to add this line
        profile_form.user = request.user #try to add this line
        profile_form.save() #and this line

        messages.success(request, ('Your profile was successfully updated!'))

        context = {
         'user_form': user_form,
         'profile_form': profile_form, #added this
        }
        template = loader.get_template('user_updated.html')

        return HttpResponse(template.render(context, request))
    else:
        messages.error(request, ('Please correct the error below.'))
else:
    user_form = UserForm()
    profile_form = ProfileForm()
context = {'user': user,
           'user_form': user_form,
           'profile_form': profile_form
           }
return render(request, 'user_details.html', context)

forms.py

class ProfileForm(forms.ModelForm):
 class Meta:
    model = Profile
    fields = ('telephone', 'date_of_birth')
    exclude = ['user']  #add this too*
    widgets = {
        'date_of_birth': forms.DateInput(attrs={'type': 'date'}),
    }**
...