python - 如何在我的 view.py 中正确包含带有 .save() 的表单
问题描述
我正在尝试在我的 form.py (AddressForm) 中创建一个新表单,但我收到一条错误消息:在分配之前引用了局部变量 'user_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 文件中获取表单,我可以在屏幕上显示它,但它不会保存数据。
谢谢您的帮助
解决方案
user_AddressForm
在请求方法不是“POST”的情况下,您尚未定义。下面p_form = ProfileUpdateForm...
你应该:
user_AddressForm = AddressForm(instance=request.user.user_profile)
这样它也出现在GET
请求中。
推荐阅读
- react-native - navigation.navigate 在本机反应中不起作用
- python - 在字段名称之后搜索自定义字段
- python - 在 python 构造函数中缺少 1 个必需的位置参数
- html - 在 asp.net 的转发器数据源控件中,服务器标记的格式不正确
- angular - 断开连接后 Strophe.js 未重新连接
- vue.js - VueJs:如何将当前的迭代项传递给对话框?
- spring-boot - 如何访问 th:objects 列表并使用 th:each 遍历它?
- linkedin - LinkedIn API:获取当前速率限制
- javascript - 循环谷歌图表数据行
- c++ - 使用#include 将大量重复代码放入单独的文件中是否可以和/或正常?