我试图创建一个混合来自不同地方的元素的表单。我认为最好的方法可能是两种不同的形式,并在同一页面上显示,除非其他人可以帮我把它全部弹出一个表格?
我认为使用2种形式没有问题,但我有点不确定如何继续(也许我不需要!)。
我有2个有些相关的课程:Person(User)和Friend,他们分享PersonBenefits。
模型看起来像这样:
class PersonBenefit(models.Model):
benefit = models.ForeignKey(Benefit, null=True)
user = models.ForeignKey(User)
class Friend(models.Model):
first_name = models.CharField(max_length=40)
last_name = models.CharField(max_length=40)
has_benefit = models.BooleanField(default=False)
ben_id_num = models.CharField(max_length=10, blank=True, null=True)
person = models.ForeignKey(User)
#good, better, best
class BenefitType(models.Model):
name = models.CharField(max_length=25)
def __str__(self):
return self.name
class Benefit(models.Model):
type = models.ForeignKey(BenefitType)
name = models.CharField(max_length=25)
forms.py看起来像这样:
class GoodBenefitForm(forms.Form):
benefit = forms.ModelChoiceField(
queryset=Benefit.objects.filter(type__name='Good'),
widget = forms.Select(attrs={'class':'g-1-3'})
)
# THIS SHOWS A LIST OF ALL THE FRIENDS FOR THIS USER - DISPLAYS THEIR NAMES NICELY WITH CHECKBOXES
friend = forms.ModelMultipleChoiceField(
queryset = Friend.objects.none(),
widget = forms.CheckboxSelectMultiple(),
)
# I WANT THIS TO BE A BUNCH OF TEXTBOXES INSTEAD OF CHECKBOXES - ONE FOR EACH FRIEND FOR THE USER
friend_group_id = forms.ModelMultipleChoiceField(
queryset = Friend.objects.none(),
widget = forms.CheckboxSelectMultiple(),
)
def __init__(self, *args, **kwargs):
self.user = kwargs.pop('user')
queryset = Friend.objects.filter(person=self.user)
super(FriendBenefitForm, self).__init__(*args, **kwargs)
self.fields['friend'].queryset = queryset
self.fields['friend_group_id'].queryset = queryset
基本上我试图让表单显示一个朋友列表'使用复选框,然后在其名称旁边,显示一个文本字段,用户可以输入ben_id_num
再次,在阅读之后,我认为拥有2个单独的表格可能是最好的方式,但我不确定我是否只是在我的表格中做了一些愚蠢的事情。 py原样,只能使用1种形式。
这基本上是:
对于每位朋友',显示一个小表单,其中包含一个带有好友名称的复选框以及紧随其后的文本字段(对应于他们的ben_id_num
答案 0 :(得分:1)
听起来你正在寻找的是Django Formset,它允许你用同一形式的一个或多个相关模型编辑模型。
我使用django-extra-views提供的UpdateWithInlinesView
和FormView
取得了一些成功,使形式集更容易管理。
如果表单确实需要大量自定义逻辑,那么就没有什么能阻止您将所有这些字段添加到自定义表单,然后在form_valid(self, form)
{{{1}} {{ {1}}方法。
关于Django的好处是你可以尽可能使用它的助手类,但如果你需要更自定义的解决方案,你总是可以手动处理。