如何在my view.py中正确包含带有.save()的窗体

2024-06-02 07:40:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我正试图在form.py(AddressForm)中创建一个新表单,但出现了一个错误:赋值前引用了局部变量“user\u AddressForm”

有人能帮我一下吗

用户名、密码和图像可以正常工作,但是地址表单没有持久性数据,并给出了错误

in my forms.py file:

from django import forms
from django.contrib.auth.models import User
from django.contrib.auth.forms import UserCreationForm
from .models import Profile

class AddressForm(forms.Form):
    address_1 = forms.CharField(
        label='Address',
        widget=forms.TextInput(attrs={'placeholder': '1234 Main St'})
    )
    address_2 = forms.CharField(
        widget=forms.TextInput(attrs={'placeholder': 'Apartment, studio, or floor'})
    )
    city = forms.CharField()
    state = forms.ChoiceField(choices=states)
    zip_code = forms.CharField(label='Zip')
    class Meta:
            model = User
            fields = ['address_1', 'address_2', 'city', 'state', 'zip_code']




in my views.py

from django.shortcuts import render, redirect
from django.contrib import messages # to display alert messages when the form data is valid
from .forms import UserSignUpForm, UserUpdateForm, ProfileUpdateForm, AddressForm
from django.contrib.auth.decorators import login_required
from django.contrib.auth import update_session_auth_hash

@login_required
def profile(request):
    if request.method == 'POST':
        u_Passform = PasswordChangeForm(request.user, request.POST)
        if u_Passform.is_valid():
            u_Passform.save()
            update_session_auth_hash(request, u_Passform)
            messages.success(request, f'Your password was updated successfully. Please log back in')
            return redirect('profile')

        u_form = UserUpdateForm(request.POST, instance=request.user)
        if u_form.is_valid:
            u_form.save()
            messages.success(request, f'Your account has been updated!')
            return redirect('profile')

        p_form = ProfileUpdateForm(request.POST,
                                   request.FILES,
                                   instance=request.user.profile)
        if p_form.is_valid():
            p_form.save()
            messages.success(request, f'Your Image was updated successfully!')
            return redirect('profile')

        user_AddressForm = AddressForm(request.POST, None)
        if user_AddressForm.is_valid:
            u_form.save()
            messages.success(request, f'Your address has been updated!')
            return redirect('profile')

    else:
        u_Passform = PasswordChangeForm(request.user)
        u_form = UserUpdateForm(instance=request.user)
        p_form = ProfileUpdateForm(instance=request.user.profile)

    context = {
        'user_AddressForm': user_AddressForm,
        'u_Passform': u_Passform,
        'u_form': u_form,
        'p_form': p_form
    }

    return render(request, 'users/profile.html', context)



In my profile.html:

<form method="POST" enctype="multipart/form-data">
                {% csrf_token %}
                <fieldset class="form-group">
                    <div class="card text-center">
                        <div class="card-header">
                            Profile Info
                        </div>
                    </div>
                    <p></p>
                    {{ u_form|crispy }} <!-- Public profile: Username, email, website url  -->
                    {{ p_form|crispy }}  <!-- Image form -->
                    {{ u_Passform|crispy }} <!-- Password reset form -->
                    {{ user_AddressForm|crispy }} <!-- Password reset form -->
                </fieldset>
                <div class="form-group">
                    <button class="btn btn-outline-info" type="submit">Update</button>
                </div>
            </form>





This is the models.py:


from django.db import models
from django.contrib.auth.models import User
from PIL import Image

# Profle model with data regarding the user
class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    address1 = models.CharField(
        "Address line 1",
        max_length=1024,
    )


    #Image feature upload
    image = models.ImageField(default='default.jpg', upload_to='profile_pics')

    # If we don't have this, it's going to say profile object only
    def __str__(self):
        return f'{self.user.username} Profile'  # it's going to print username Profile

    def save(self, *args, **kwargs):
            super().save(*args, **kwargs)

            img = Image.open(self.image.path)

            if img.height > 300 or img.width > 300:
                output_size = (300, 300)
                img.thumbnail(output_size)
                img.save(self.image.path)

现在。。。如果我只是从forms.py文件中获取表单,我可以在屏幕上显示它,但它不会保存数据

谢谢你的帮助


Tags: djangofromimportformauthmodelsrequestsave
1条回答
网友
1楼 · 发布于 2024-06-02 07:40:10

在请求方法不是'POST'的情况下,您还没有定义user_AddressForm。在p_form = ProfileUpdateForm...下面您应该:

user_AddressForm = AddressForm(instance=request.user.user_profile)

这样,它也会出现在GET请求中

相关问题 更多 >