1

Voici une application simple à choix multiples.Django: comment accéder aux champs en-ligne à partir du formulaire du modèle parent?

Une question peut avoir 4 choix.

Dans le panneau d'administration, quand enregistrer une nouvelle question, je veux vérifier le nombre de choix qui sont vides (pas de mots) mais je ne sais pas comment accéder aux 4 choix.

Comment puis-je accéder aux valeurs des choix à l'intérieur de la fonction clean() de QuestionForm?

#model.py 
class Question(models.Model): 
    question = models.CharField(max_length = 250) 

class Choice(models.Model): 
    question = models.ForeignKey(Question) 
    choice = models.CharField(max_length = 250) 

#admin.py 
class ChoiceInline(admin.TabularInline): 
    model = Choice 
    extra = 4 
    can_delete = False 
    max_num = 4 # fix to have 4 choices 


class QuestionForm(forms.ModelForm): 
    class Meta: 
     model = Question 
     fields = '__all__' 

    def clean(self): 
     """ 
     HERE, i want to access the 4 choices model 
     """ 
     return self.cleaned_data 

class QuestionAdmin(admin.ModelAdmin): 
    form = QuestionForm 
    inlines = [ChoiceInline]   


admin.site.register(Question, QuestionAdmin) 
admin.site.register(Choice, ChoiceAdmin) 

Répondre

0

Une façon de faire est d'accéder à partir du côté en ligne, plutôt que le formulaire principal.

Créer une ChoiceForm héritant de ModelForm, et remplacer la méthode clean() avec le vôtre, quelque chose comme:

class ChoiceForm(forms.ModelForm): 
    def clean(self): 
     cleaned_data = super(ChoiceForm, self).clean() 
     for f in self.forms: 
      f.cleaned_data['choice'] # contains the text you want 
      # so you can check if it's empty and raise ValidationError() 
      # if needed 
     return self.cleaned_data 

Jetez un oeil à https://docs.djangoproject.com/en/1.11/topics/forms/modelforms/#overriding-clean-on-a-modelformset pour plus de détails.