2016-12-16 5 views
0

Ich bin immer noch ziemlich unerfahren mit Django, aber ich stecke auf diesem einen Problem fest. Ich bekam ein fast abgeschlossenes Projekt, in dem Eltern ihre Kinder bewerten konnten und dann konnten Forscher diese Daten mit Django und Postgresql sammeln und speichern. Es gibt mehrere verwandte Modelle in zwei verschiedenen Apps, die alle miteinander in Beziehung stehen. Ein "Instrument" (Art des Tests) kann mehrere Studien haben, die wiederum mehrere Teilnehmer haben können. Ich habe ein schlecht gezeichnetes Bild gemacht, um zu beschreiben, was ich meine.Django-Formular-Validierung basierend auf Entferntem verwandtem Modell

Es gibt ein Formular, BackgroundForm, das demographische Informationen (Alter, Geburtsgewicht usw.) sammelt. Diese Daten werden dann im Modell hinterlegt, BackgroundInfo mit der Administrations-ID des Teilnehmers. Ich habe Probleme, die Formularvalidierung flexibler zu machen. Bestimmte Instrumente (Tests) sind für bestimmte Altersstufen und ich bin mir nicht sicher, wie ich diese Informationen bis zur BackgroundForm-Validierung erhalten kann, da sich hier mehrere Beziehungen befinden. Gibt es eine Möglichkeit, die Formularvalidierung zu aktivieren, die in Abhängigkeit von den Attributen eines Modells validiert wird, das mehrere Beziehungen entfernt ist?

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) 

Antwort

0

Macht nichts! Ich habe ein wenig mehr gesucht und konnte dieses page finden. Im Grunde nahm ich die Argumente, die ich in views.py wollte, und übergab sie meinem Formular.

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 
Verwandte Themen