代码之家  ›  专栏  ›  技术社区  ›  Hanny

创建一个使用两个不同模型属性的表单

  •  0
  • Hanny  · 技术社区  · 7 年前

    我认为使用2个表单没有问题,但我有点不确定如何继续(也许我不需要!)。

    模型如下所示:

    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)
    

    表格。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

    再一次,在阅读之后,我认为拥有两个单独的表单可能是最好的方式,但我不确定我是否只是在表单中做了一些愚蠢的事情。py原样,只需1个表单即可。

    这基本上是:

    对于每个“朋友”,显示一个小表单,其中有一个复选框,该复选框后面紧跟着朋友的名字和一个文本字段(对应于他们的 ben\u id\u num

    1 回复  |  直到 7 年前
        1
  •  1
  •   Franey    7 年前

    听起来你要找的是一个 Django Formset

    CreateWithInlinesView UpdateWithInlinesView django-extra-views

    FormView form_valid(self, form)

    Django的优点是,您可以在可以的时候使用它的助手类,但是如果您需要更自定义的解决方案,您总是可以手动处理事情。