2016-12-16 2 views
0

Я до сих пор довольно неопытный с Django, но я застрял в этой проблеме. Мне дали почти законченный проект, в котором родители могли заполнять оценки своих детей, а затем исследователи могли собирать и хранить эти данные с помощью Django и Postgresql. Существует несколько связанных моделей, расположенных в двух разных приложениях, которые все относятся друг к другу. «Инструмент» (тип теста) может иметь несколько исследований, которые, в свою очередь, могут иметь несколько участников. Я сделал плохо нарисованный образ, чтобы описать, что я имею в виду.Проверка формы Django на основе удаленной связанной модели

Существует одна форма, BackgroundForm, которая собирает демографическую информацию (возраст, вес при рождении и т. Д.). Эти данные затем сохраняются в модели BackgroundInfo с идентификатором администратора участника. У меня возникают проблемы, делающие валидацию формы более гибкой. Некоторые инструменты (тесты) предназначены для определенных возрастов, и я не уверен, как получить эту информацию вплоть до проверки 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) 

ответ

0

Ничего! Я сделал еще несколько поисков, и я смог найти это 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 
Смежные вопросы