【问题标题】:Django Form Validation Based on Distant Related Model基于远程相关模型的 Django 表单验证
【发布时间】:2017-05-02 16:17:23
【问题描述】:

我对 Django 仍然很缺乏经验,但我被困在这个问题上。我得到了一个几乎完成的项目,父母可以填写他们孩子的评估,然后研究人员可以使用 Django 和 Postgresql 收集和存储这些数据。有几个相关模型位于两个不同的应用程序中,它们都相互关联。一个“仪器”(测试类型)可以有多个研究,而这些研究又可以有多个参与者。我做了一个画得很糟糕的图像来描述我的意思。

有一种表格,BackgroundForm,用于收集人口统计信息(年龄、出生体重等)。然后将此数据存储在模型中,BackgroundInfo 与参与者的管理 ID。我在使表单验证更灵活时遇到问题。某些工具(测试)是针对特定年龄的,我不确定如何将这些信息一直获取到 BackgroundForm 验证,因为它位于几个关系之外。有没有办法启用表单验证,根据位于几个关系之外的模型的属性进行验证?

Map of Django site

cdi_forms/forms.py

class BackgroundForm(BetterModelForm):
    age = forms.IntegerField()
    sex = forms.ChoiceField(choices=(('M', 'Male'), ('F', 'Female'), ('O', 'Other')), widget=forms.RadioSelect)

    def clean(self):
        cleaned_data = super(BackgroundForm, self).clean()
        if cleaned_data.get('age') == '':
            self.add_error('age', 'Please enter your child\'s DOB in the field above.')

    class Meta:
        model = BackgroundInfo
        exclude = ['administration']

cdi_forms/models.py

class BackgroundInfo(models.Model):
    administration = models.OneToOneField("researcher_UI.administration")
    age = models.IntegerField(verbose_name = "Age (in months)")
    sex = models.CharField(max_length = 1, choices = (('M', "Male"), ('F', "Female"), ('O', "Other")))

researcher_UI/models.py

class administration(models.Model):
    study = models.ForeignKey("study")
    subject_id = models.IntegerField()

class study(models.Model):
    researcher = models.ForeignKey("auth.user")
    name = models.CharField(max_length = 51)
    instrument = models.ForeignKey("instrument")

class instrument(models.Model):
    name = models.CharField(max_length = 51, primary_key=True)
    language = models.CharField(max_length = 51, blank = True)
    min_age = models.IntegerField(verbose_name = "Minimum age", null = True)
    max_age = models.IntegerField(verbose_name = "Maximum age", null = True)

【问题讨论】:

    标签: python django forms validation django-forms


    【解决方案1】:

    没关系!我做了更多搜索,找到了这个page。基本上,我在 views.py 中获取了我想要的参数并将它们传递给我的表单。

    cdi_forms/views.py

    def background_info_form(request, hash_id):
        administration_instance = administration.objects.get(url_hash = hash_id) # Each test has it's own URL identifier
        min_age = administration_instance.study.instrument.min_age
        max_age = administration_instance.study.instrument.max_age
        ...
        background_form = BackgroundForm(request.POST, instance = background_instance, min_age = min_age, max_age = max_age)
    

    cdi_forms/forms.py

    class BackgroundForm(BetterModelForm):
        age = forms.IntegerField()
        ...
        def __init__(self, *args, **kwargs):
            self.min_age = kwargs.pop('min_age', None)
            self.max_age = kwargs.pop('max_age', None)
            super(BackgroundForm, self).__init__(*args, **kwargs)
        ...
        def clean(self):
            #Now I can compare my age field to self.min_age and self.max_age
    

    【讨论】:

      猜你喜欢
      • 2020-04-18
      • 1970-01-01
      • 2012-03-30
      • 2012-08-07
      • 1970-01-01
      • 2011-03-12
      • 2017-06-14
      • 2021-05-29
      • 2012-05-02
      相关资源
      最近更新 更多