- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
因此,我正在开发一个Web应用程序,该应用程序已在其注册过程中实现了安全性问题。由于我的模型的设置方式以及我试图使用Django的基于类的视图(CBV)的事实,我在将所有内容完全集成在一起时遇到了一些问题。这是我的模型的样子:
Model.py
class AcctSecurityQuestions(models.Model):
class Meta:
db_table = 'security_questions'
id = models.AutoField(primary_key=True)
question = models.CharField(max_length = 250, null=False)
def __unicode__(self):
return u'%s' % self.question
class AcctUser(AbstractBaseUser, PermissionsMixin):
...
user_questions = models.ManyToManyField(AcctSecurityQuestions, through='SecurityQuestionsInter')
...
class SecurityQuestionsInter(models.Model):
class Meta:
db_table = 'security_questions_inter'
acct_user = models.ForeignKey(AcctUser)
security_questions = models.ForeignKey(AcctSecurityQuestions, verbose_name="Security Question")
answer = models.CharField(max_length=128, null=False)
class AcctRegistration(CreateView):
template_name = 'registration/registration_form.html'
disallowed_url_name = 'registration_disallowed'
model = AcctUser
backend_path = 'registration.backends.default.DefaultBackend'
form_class = AcctRegistrationForm
success_url = 'registration_complete'
def form_valid(self, form):
context = self.get_context_data()
securityquestion_form = context['formset']
if securityquestion_form.is_valid():
self.object = form.save()
securityquestion_form.instance = self.object
securityquestion_form.save()
return HttpResponseRedirect(self.get_success_url())
else:
return self.render_to_response(self.get_context_data(form=form))
def get_context_data(self, **kwargs):
ctx = super(AcctRegistration, self).get_context_data(**kwargs)
if self.request.POST:
ctx['formset'] = SecurityQuestionsInLineFormSet(self.request.POST, instance=self.object)
ctx['formset'].full_clean()
else:
ctx['formset'] = SecurityQuestionsInLineFormSet(instance=self.object)
return ctx
class AcctRegistrationForm(ModelForm):
password1 = CharField(widget=PasswordInput(attrs=attrs_dict, render_value=False),
label="Password")
password2 = CharField(widget=PasswordInput(attrs=attrs_dict, render_value=False),
label="Password (again)")
class Meta:
model = AcctUser
...
def clean(self):
if 'password1' in self.cleaned_data and 'password2' in self.cleaned_data:
if self.cleaned_data['password1'] != self.cleaned_data['password2']:
raise ValidationError(_("The two password fields didn't match."))
return self.cleaned_data
SecurityQuestionsInLineFormSet = inlineformset_factory(AcctUser,
SecurityQuestionsInter,
extra=2,
max_num=2,
can_delete=False
)
get
和
post
,该如何从表单集中添加数据?我又该如何调用表单集数据?
最佳答案
当数据库中已有用户对象时,内联表单集非常方便。然后,在初始化时,它将自动预载正确的安全性问题,等等。但是对于创建而言,正常的模型表单集可能是最好的,并且不包含贯穿表的与用户联系的字段。然后,您可以创建用户并在创建的穿透表上手动设置用户字段。
这是我仅使用模型表单集的方法:
forms.py:
SecurityQuestionsFormSet = modelformset_factory(SecurityQuestionsInter,
fields=('security_questions', 'answer'),
extra=2,
max_num=2,
can_delete=False,
)
views.py:
class AcctRegistration(CreateView):
# class data like form name as usual
def form_valid(self):
# override the ModelFormMixin definition so you don't save twice
return HttpResponseRedirect(self.get_success_url())
def form_invalid(self, form, formset):
return self.render_to_response(self.get_context_data(form=form, formset=formset))
def get(self, request, *args, **kwargs):
self.object = None
form_class = self.get_form_class()
form = self.get_form(form_class)
formset = SecurityQuestionsFormSet(queryset=SecurityQuestionsInter.objects.none())
return self.render_to_response(self.get_context_data(form=form, formset=formset))
def post(self, request, *args, **kwargs):
self.object = None
form_class = self.get_form_class()
form = self.get_form(form_class)
formset = SecurityQuestionsFormSet(request.POST)
form_valid = form.is_valid()
formset_valid = formset.is_valid()
if form_valid and formset_valid:
self.object = form.save()
security_questions = formset.save(commit=False)
for security_question in security_questions:
security_question.acct_user = self.object
security_question.save()
formset.save_m2m()
return self.form_valid()
else:
return self.form_invalid(form, formset)
instance
参数。然后,如果queryset的大小不超过
max_num
参数,它将添加
extra
未绑定形式,直到
max_num
或指定数量的附加内容。指定空的查询集意味着我们已经说过我们不想编辑任何模型实例,我们只想创建新数据。
SecurityQuestionsInter
对象就完成了。
form
和
formset
)都可以根据字段ID和formset前缀(默认值在这里可以正常工作,因为在一个页面中有多个formset会变得更加复杂)来判断是哪一部分POST数据是它的责任。
form
处理密码,但对安全问题一无所知。
formset
处理两个安全性问题,但对密码(或暗含用户)一无所知。在内部,
formset
创建两种形式,每种形式都处理一个问题/答案对-再次,它们依赖于ID中的编号来告诉他们要处理的POST数据的哪一部分。
form.save(commit=False)
的返回值)作为
instance
参数传递,或者如果用户格式无效,则传递
None
就是我并非100%确信在第二种情况下它会做正确的事情。如果您发现这种方法更清晰,则可能值得测试-按照最初使用的方式设置内联表单集,在
get
中初始化不带参数的表单集,然后将最终保存行为保留在
form_valid
中:
def form_valid(self, form, formset):
# commit the uncommitted version set in post
self.object.save()
form.save_m2m()
formset.save()
return HttpResponseRedirect(self.get_success_url())
def post(self, request, *args, **kwargs):
self.object = None
form_class = self.get_form_class()
form = self.get_form(form_class)
if form.is_valid():
self.object = form.save(commit=False)
# passing in None as the instance if the user form is not valid
formset = SecurityQuestionsInLineFormSet(request.POST, instance=self.object)
if form.is_valid() and formset.is_valid():
return self.form_valid(form, formset)
else:
return self.form_invalid(form, formset)
form_valid
中。
关于django - 在基于Django类的 View (CBV)中保存inlineformset,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16951751/
这是我的 models.py class Invoices(models.Model): ... sum_w_vat = models.DecimalField(max_digits=
我正在展示两个单独的示例项目。第一个是与联系人相关的,并展示了使用表单向导的原理。第二个是配方相关项目的成分,它展示了如何在表单中使用内联。我希望内联在我的表单向导中与它们在正常表单中的工作方式相同。
我正在尝试使用以下代码将自定义字段添加到 InlineFormset,但这些字段不会显示在 Django Admin 中。 InlineFormset 是否过于锁定而不允许这样做?我的打印“ding”
欧盟可以使用此表格来选择他们在任何给定项目中扮演的角色(项目经理、开发人员等)。我想将项目字段选项限制为仅员工部门中的选项。现在,欧盟可以选择任何部门的项目(但不能选择部门,我已经完全排除了)我该怎么
我需要清理内联表单集中的特定字段,但我不知道该怎么做。 我已经尝试过使用表单集 def clean(self)方法,但不知道在哪里保存清理过的值。如果我尝试将清洁值设置为 forms[0].data[
下面是我执行 inlineformset django 所需的代码。问题是我有两个具有相同外键的属性,它返回 Django 错误 models.py class Reference(models.Mo
我有以下型号: class Event(models.Model): name = models.CharField(max_length=128, null=True, blank=True
假设我有 3 个模型: 棋手 锦标赛 参与 “参与”是另外两个的联结表。 我在管理面板中使用以下 InlineFormSet 以显示参与模型中的一些字段。 from .models import Pa
我有一个 Django 项目,有 2 个模型,一个 Structure 和 Bracket,Bracket 有一个结构的外键(即一对多,一个结构有很多括号)。我为管理站点创建了一个 TabularIn
我有以下订单行表单集。 由于产品下拉列表将包含 100 多种产品,我想根据产品类型选择过滤下拉列表中可用的产品。我一直在尝试使用 JQuery 来实现这一点,查看网络上的几个解决方案和示例,但我真的陷
我想通过 ModelFormSet 显示多个表单,其中每个表单依次显示连接到该对象的所有对象的 InlineFormSets。 现在我不太确定如何为每个 ModelFormSet 提供实例。我考虑过对
我有两个模型 class A(models.Model): name = models.CharField(50) type = models.CharField
我是一名优秀的程序员,十分优秀!