- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在我的注册页面中,我有 2 个表单:用户表单和个人资料表单。
个人资料表单依赖于个人资料模型,该模型具有到用户模型的 OneToOneField - 来自 Django 的默认用户模型。
这个想法是,当创建用户时,也会创建该用户的个人资料:
@receiver(post_save, sender=User)
def update_user_profile(sender, instance, created, **kwargs):
if created:
Profile.objects.create(user=instance)
instance.profile.save()
配置文件模型:
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
# birth_date = models.DateField(null=True, blank=True)
dni = models.CharField(max_length=30, blank=True)
#phone_number = models.CharField(max_length=15, blank=True)
shipping_address1 = models.CharField(max_length=100, blank=False)
shipping_address2 = models.CharField(max_length=100, blank=False)
shipping_department = models.CharField(max_length=100, blank=False)
shipping_province = models.CharField(max_length=100, blank=False)
shipping_district = models.CharField(max_length=100, blank=False)
def __str__(self):
return str(self.user.first_name) + "'s profile"
问题:UserForm.is_valid() 为 True
,但 Profile_Form.is_valid() 为 False
。
但在我的请求中,我获得了 ProfileForm 的所有正确值:
<QueryDict: {'csrfmiddlewaretoken': ['91sJC01vyty3Z9ECjrSop1bouUOF2ZeC9m6XZUgk0nTEH7p6W0DmtuQaB4EBhV22'], 'first_name': ['Juana'], 'last_name': ['Juana'], 'username': ['juana
juana'], 'dni': ['454545'], 'email': ['juana@gmail.com'], 'password1': ['caballo123'], 'password2': ['caballo123'], 'shipping_address1': ['Urb. La Merced Mz.G Lot.32'], 'ship
ping_address2': ['Villa FAP - San Roque'], 'shipping_department': ['Cajamarca'], 'shipping_province': ['Cajamarca'], 'shipping_district': ['Cajamarca']}>
如何正确保存ProfileForm?
显示 UserForm 和 ProfileForm 的 View :
@transaction.atomic
def signupView(request):
peru = Peru.objects.all()
department_list = set()
province_list = set()
district_list = set()
for p in peru:
department_list.add(p.departamento)
department_list = list(department_list)
print("Department List: ", department_list)
if len(department_list):
province_list = set(Peru.objects.filter(departamento=department_list[0]).values_list("provincia", flat=True))
print("Provice List: ", province_list)
province_list = list(province_list)
# print("dfsfs", province_list)
else:
province_list = set()
if len(province_list):
district_list = set(
Peru.objects.filter(departamento=department_list[0], provincia=province_list[0]).values_list("distrito",
flat=True))
print("district List: ", district_list)
else:
district_list = set()
if request.method == 'POST':
user_form = SignUpForm(request.POST)
profile_form = ProfileForm(district_list, province_list, department_list, request.POST)
print("This is Profile Form: ", profile_form)
print("Is Profile_Form valid: ", profile_form.is_valid())
if user_form.is_valid() and profile_form.is_valid():
user = user_form.save()
username = user_form.cleaned_data.get('username')
signup_user = User.objects.get(username=username)
customer_group = Group.objects.get(name='Clientes')
customer_group.user_set.add(signup_user)
raw_password = user_form.cleaned_data.get('password1')
user.refresh_from_db() # This will load the Profile created by the Signal
# print(user_form.cleaned_data)
print("Form is valid: district_list, province_list, department_list")
print(district_list, province_list, department_list)
profile_form = ProfileForm(district_list, province_list, department_list, request.POST,
instance=user.profile) # Reload the profile form with the profile instance
profile_form.full_clean() # Manually clean the form this time. It is implicitly called by "is_valid()" method
# print(profile_form.cleaned_data)
profile_form.save() # Gracefully save the form
user = authenticate(username=username, password=raw_password)
login(request, user)
return redirect('cart:cart_detail')
else:
print("INVALID FORM")
user_form = SignUpForm()
profile_form = ProfileForm(district_list, province_list, department_list)
print('end of profile postdata print')
print(profile_form)
print("Profile Data:")
return render(request, 'accounts/signup.html', {
'user_form': user_form,
'profile_form': profile_form
})
该行返回 false:
print("Is Profile_Form valid: ", profile_form.is_valid())
个人资料表单:
class ProfileForm(ModelForm):
def __init__(self, district_list, province_list, department_list, *args, **kwargs):
super(ProfileForm, self).__init__(*args, **kwargs)
self.fields['shipping_district'] = forms.ChoiceField(choices=tuple([(name, name) for name in district_list]))
self.fields['shipping_province'] = forms.ChoiceField(choices=tuple([(name, name) for name in province_list]))
self.fields['shipping_department'] = forms.ChoiceField(choices=tuple([(name, name) for name in department_list]))
dni = forms.CharField(label='DNI', max_length=100, required=True)
shipping_address1 = forms.CharField(label='Dirección de envío', max_length=100, required=True)
shipping_address2 = forms.CharField(label='Dirección de envío 2 (opcional)', max_length=100, required=False)
class Meta:
model = Profile
fields = ('dni', 'shipping_address1',
'shipping_address2', 'shipping_department', 'shipping_province', 'shipping_district')
更新1:
else:
print("INVALID User_FORM")
print(user_form.errors)
print("INVALID Profile_FORM")
print(profile_form.errors)
INVALID User_Form
INVALID Profile_Form
<ul class="errorlist"><li>shipping_province<ul class="errorlist"><li>Select a valid choice. Tarata is not one of the available choices.</li></ul></li><li>shipping_district<ul
class="errorlist"><li>Select a valid choice. Estique is not one of the available choices.</li></ul></li></ul>
[25/Jan/2019 18:18:38] "POST /account/create/ HTTP/1.1" 200 16522
[25/Jan/2019 18:18:38] "GET /static/css/footer.css HTTP/1.1" 404 1767
最佳答案
表单中的选择字段不需要值列表。您将有多个选项,但该字段只有一个值。
所以,试试这个:
profile_form = ProfileForm(request.POST)
并计算 shipping_district
、shipping_province
和 shipping_department
的值,作为表单中 __init__
的一部分。
如果为了查看错误而更改您的代码:
user_form_valid = user_form.is_valid()
profile_form_valid = profile_form.is_valid()
if user_form_valid and profile_form_valid:
# ...
else:
# print(user_form.errors)
# print(profile_form.errors)
# ...
您向用户呈现的形式与您在 View 中绑定(bind)的形式不同,请尝试初始化,尝试找到一种方法来初始化这些选择,使每个 具有相同的值ProfileForm
您实例化。
另一方面,我鼓励您使用FormSet对于这种情况。
关于python - Django:正确 request.POST 中的值但无法保存表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54373101/
我想做的是让 JTextPane 在 JPanel 中占用尽可能多的空间。对于我使用的 UpdateInfoPanel: public class UpdateInfoPanel extends JP
我在 JPanel 中有一个 JTextArea,我想将其与 JScrollPane 一起使用。我正在使用 GridBagLayout。当我运行它时,框架似乎为 JScrollPane 腾出了空间,但
我想在 xcode 中实现以下功能。 我有一个 View Controller 。在这个 UIViewController 中,我有一个 UITabBar。它们下面是一个 UIView。将 UITab
有谁知道Firebird 2.5有没有类似于SQL中“STUFF”函数的功能? 我有一个包含父用户记录的表,另一个表包含与父相关的子用户记录。我希望能够提取用户拥有的“ROLES”的逗号分隔字符串,而
我想使用 JSON 作为 mirth channel 的输入和输出,例如详细信息保存在数据库中或创建 HL7 消息。 简而言之,输入为 JSON 解析它并输出为任何格式。 最佳答案 var objec
通常我会使用 R 并执行 merge.by,但这个文件似乎太大了,部门中的任何一台计算机都无法处理它! (任何从事遗传学工作的人的附加信息)本质上,插补似乎删除了 snp ID 的 rs 数字,我只剩
我有一个以前可能被问过的问题,但我很难找到正确的描述。我希望有人能帮助我。 在下面的代码中,我设置了varprice,我想添加javascript变量accu_id以通过rails在我的数据库中查找记
我有一个简单的 SVG 文件,在 Firefox 中可以正常查看 - 它的一些包装文本使用 foreignObject 包含一些 HTML - 文本包装在 div 中:
所以我正在为学校编写一个 Ruby 程序,如果某个值是 1 或 3,则将 bool 值更改为 true,如果是 0 或 2,则更改为 false。由于我有 Java 背景,所以我认为这段代码应该有效:
我做了什么: 我在这些账户之间创建了 VPC 对等连接 互联网网关也连接到每个 VPC 还配置了路由表(以允许来自双方的流量) 情况1: 当这两个 VPC 在同一个账户中时,我成功测试了从另一个 La
我有一个名为 contacts 的表: user_id contact_id 10294 10295 10294 10293 10293 10294 102
我正在使用 Magento 中的新模板。为避免重复代码,我想为每个产品预览使用相同的子模板。 特别是我做了这样一个展示: $products = Mage::getModel('catalog/pro
“for”是否总是检查协议(protocol)中定义的每个函数中第一个参数的类型? 编辑(改写): 当协议(protocol)方法只有一个参数时,根据该单个参数的类型(直接或任意)找到实现。当协议(p
我想从我的 PHP 代码中调用 JavaScript 函数。我通过使用以下方法实现了这一点: echo ' drawChart($id); '; 这工作正常,但我想从我的 PHP 代码中获取数据,我使
这个问题已经有答案了: Event binding on dynamically created elements? (23 个回答) 已关闭 5 年前。 我有一个动态表单,我想在其中附加一些其他 h
我正在尝试找到一种解决方案,以在 componentDidMount 中的映射项上使用 setState。 我正在使用 GraphQL连同 Gatsby返回许多 data 项目,但要求在特定的 pat
我在 ScrollView 中有一个 View 。只要用户按住该 View ,我想每 80 毫秒调用一次方法。这是我已经实现的: final Runnable vibrate = new Runnab
我用 jni 开发了一个 android 应用程序。我在 GetStringUTFChars 的 dvmDecodeIndirectRef 中得到了一个 dvmabort。我只中止了一次。 为什么会这
当我到达我的 Activity 时,我调用 FragmentPagerAdapter 来处理我的不同选项卡。在我的一个选项卡中,我想显示一个 RecyclerView,但他从未出现过,有了断点,我看到
当我按下 Activity 中的按钮时,会弹出一个 DialogFragment。在对话框 fragment 中,有一个看起来像普通 ListView 的 RecyclerView。 我想要的行为是当
我是一名优秀的程序员,十分优秀!