【问题标题】:Excluding elements from the queryset on a inlineformset从内联表单集的查询集中排除元素
【发布时间】:2021-03-15 00:52:44
【问题描述】:

假设我有这些模型:

class Club(models.Model):
    name = models.CharField(max_length=100)
    members = models.ManyToMany(User)
    

class Event(models.Model):
    name = models.CharField(max_length=100)
    date = models.DateField()
    club = models.ForeignKey(Club, models.CASCADE)
    

所以我需要的是获取俱乐部的所有活动,但需要使用内联表单集或任何类型的表单集。

我可以用这个创建一个工作表单集:

from django.forms import inlineformset_factory

def my_view(request):
    ...
    CustomFormset = inlineformset_factory(Club, Event, fields=('name', 'date'))
    actual_formset = CustomFormset(instance=Club.objects.get(pk=1)
    ...

现在可行,但我得到了与俱乐部相关的每一个事件,但我实际上需要获取符合某些参数的元素,例如我只想要日期大于今天的元素。

我还没有找到实现此目的的方法,希望得到任何指导。

感谢您的宝贵时间

【问题讨论】:

    标签: django django-models django-forms formset


    【解决方案1】:

    您可以将exclude()queryset 一起使用,以排除具有给定条件的对象。

    它可以像文档中显示的那样全局应用于对象 - 我相信这是你的情况 - 或者它可以与任何其他 queryset 方法结合使用,例如 filter()

    【讨论】:

      【解决方案2】:

      对我来说,最好的方法是创建一个 ModelForm 并在其中覆盖验证。然后用它来调用formset。

      #forms.py
      class EventForm(forms.ModelForm):
          class Meta:
          model = Event
          fields = ['name', 'date',]
      
          def clean_date(self):
              date = self.cleaned_data.get('date')
              if date < timezone.today():
                  raise forms.ValidationError('Please enter a date greater than today')
              return date
          
      

      然后:

      CustomFormset = inlineformset_factory(Club, Event, form=EventForm)
          
      

      clean_fieldname() 方法在表单子类上调用 - 替换为表单字段属性的名称。此方法执行特定于该特定属性的任何清理,与它的字段类型无关。该方法不传递任何参数。您需要在 self.cleaned_data 中查找该字段的值,并记住此时它将是一个 Python 对象,而不是表单中提交的原始字符串(它将在 clean_data 中,因为通用字段 clean() 方法,上面已经清理过一次数据)。

      Overriding the clean() method

      Form validation

      【讨论】:

        猜你喜欢
        • 2018-07-11
        • 1970-01-01
        • 2013-01-27
        • 1970-01-01
        • 2016-04-07
        • 2011-05-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多