2016-07-27 20 views
0

Ich bin mir nicht sicher, warum das Hinzufügen von Widgets in meinem GroupForm-Formular in forms.py meine Validierungen dazu brachte, drunter und drüber zu gehen. Zuvor respektierten sie meine Modelle, jetzt nachdem sie widget attrs für alles hinzugefügt haben, respektiert sie nicht mehr die Modelle und sagt, dass für alles ein Feld benötigt wird. Gibt es einen anderen Gegenstand, den ich bei der Definition des Widgets vermisst habe?Validierung auf CreateView und UpdateView in Django wird immer ausgelöst, auch wenn Modell nicht funktioniert/sollte

forms.py:

class GroupForm(forms.ModelForm): 
    group_name = forms.CharField(widget = forms.TextInput(attrs={'tabindex':'1', 'placeholder':'Groups name'})) 
    group_contact = forms.CharField(widget = forms.TextInput(attrs={'tabindex':'2', 'placeholder':'Groups point of contact person'})) 
    tin = forms.CharField(widget = forms.TextInput(attrs={'tabindex':'3', 'placeholder':'Groups tin#'})) 
    npi = forms.CharField(widget = forms.TextInput(attrs={'tabindex':'4', 'placeholder':'Groups npi#'})) 
    notes = forms.CharField(widget = forms.Textarea(attrs={'tabindex':'5', 'placeholder':'Group notes'})) 
    #notes = forms.CharField(widget = forms.TextInput(attrs={'tabindex':'5', 'placeholder':'Groups notes'})) 

    billing_address = forms.ModelChoiceField(queryset=Address.objects.all(), widget=forms.Select(attrs={'tabindex':'6'})) 
    mailing_address = forms.ModelChoiceField(queryset=Address.objects.all(), widget=forms.Select(attrs={'tabindex':'7'})) 
    start_date = forms.DateField(widget=forms.TextInput(attrs= 
           { 
            'class':'datepicker', 
            'tabindex' : '8', 
            'placeholder' : 'Groups start date' 
           })) 
    end_date = forms.DateField(widget=forms.TextInput(attrs= 
           { 
            'class':'datepicker', 
            'tabindex' : '9', 
            'placeholder' : 'Groups term date' 
           })) 
    change_date = forms.DateField(widget=forms.TextInput(attrs= 
           { 
            'class':'datepicker', 
            'tabindex' : '10', 
            'placeholder' : 'Groups changed date' 
           })) 

    change_text = forms.CharField(widget = forms.TextInput(attrs={'tabindex':'11', 'placeholder':'Reason for date change'})) 
    #term_comment = forms.CharField(widget= forms.TextInput(attrs={'tabindex':'12', 'placeholder':'Note on group term'})) 
    term_comment = forms.CharField(widget = forms.Textarea(attrs={'tabindex':'12', 'placeholder':'Note on group term'})) 
    group_phone = forms.RegexField(regex=r'^(\+\d{1,2}\s)?\(?\d{3}\)?[\s.-]?\d{3}[\s.-]?\d{4}$', 
           error_message = ("Phone number must be entered in the format: '555-555-5555 or 5555555555'. Up to 15 digits allowed."), 
           widget = forms.TextInput(attrs={'tabindex':'13', 'placeholder': '555-555-5555 or 5555555555'})) 

    group_fax = forms.RegexField(regex=r'^(\+\d{1,2}\s)?\(?\d{3}\)?[\s.-]?\d{3}[\s.-]?\d{4}$', 
           error_message = ("Fax number must be entered in the format: '555-555-5555 or 5555555555'. Up to 15 digits allowed."), 
           widget = forms.TextInput(attrs={'tabindex':'15', 'placeholder': '555-555-5555 or 5555555555'})) 

    group_term = forms.ModelChoiceField(queryset=GroupTerm.objects.all(), widget=forms.Select(attrs={'tabindex':'16'})) 

    class Meta: 
     model=Group 
     exclude = ['created_at', 'updated_at'] 

views.py:

class GroupCreateView(CreateView): 
    model = Group 
    form_class = GroupForm 
    template_name = 'ipaswdb/group/group_form.html' 
    success_url = 'ipaswdb/group/' 

    def form_valid(self, form): 
     return super(GroupCreateView, self).form_valid(form) 

class GroupUpdateView(UpdateView): 
    model = Group 
    form_class = GroupForm 
    template_name = 'ipaswdb/group/group_form.html' 
    success_url = 'ipaswdb/group/' 

Gruppenmodell:

class Group(models.Model): 
    group_name = models.CharField(max_length=50) 
    group_contact= models.CharField(max_length=50) 
    tin = models.CharField(max_length=50) 
    npi =models.CharField(max_length=50) 
    notes = models.TextField(max_length = 255, null=True, blank=True) 
    billing_address = models.ForeignKey('Address', related_name = 'billing_address', on_delete=models.SET_NULL, null=True) 
    mailing_address = models.ForeignKey('Address', related_name = 'mailing_address', on_delete=models.SET_NULL, null=True, blank=True) 
    start_date = models.DateField(auto_now=False, auto_now_add=False, null=True, blank=True) 
    end_date = models.DateField(auto_now=False, auto_now_add=False, null=True, blank=True) 
    change_date = models.DateField(auto_now=False, auto_now_add=False, null=True, blank=True) 
    change_text = models.TextField(max_length = 255, null=True, blank=True) 
    term_comment = models.TextField(max_length = 255, null=True, blank=True) 
    group_phone=models.CharField(max_length=50) 
    group_fax = models.CharField(max_length=50) 
    group_term = models.ForeignKey(GroupTerm, on_delete=models.SET_NULL, null=True, blank=True) #quesiton is can a group be termed many times? 
    created_at=models.DateField(auto_now_add=True) 
    updated_at=models.DateField(auto_now=True) 

    #provider_location = models.ManyToManyField('ProviderLocations', through='GroupLocations') 

    def __str__(self): 
     return self.group_name 

Antwort

1

Es ist nicht, weil Sie die Widgets hinzugefügt, es ist, weil Sie tatsächlich das neu definiert Bei der Neudefinition der Felder haben Sie die Anforderungen Ihres Modells nicht respektiert. Zum Beispiel in Ihrem Modell

mailing_address = models.ForeignKey(..., null=True, blank=True) 

Postanschrift leer sein durfte, aber in Ihrem definierten Formularfeld ist es erforderlich.

mailing_address = forms.ModelChoiceField(queryset=Address.objects.all(), widget=forms.Select(attrs={'tabindex':'7'})) 
# You need required=False 

Wenn Sie Ihre eigenen Felder für die modelForm Sie können neu zu definieren, dann müssen Sie Ihr Modell respektieren, während es zu tun. Jedoch, können Sie auch erreichen, was Sie versuchen, indem Sie bereits vorhandene Wörterbücher in modelForm verwenden. Zum Beispiel in Ihrem class Meta können Sie die Widgets wie dies außer Kraft setzen:

class YourForm(ModelForm): 
    class Meta: 
     model = YourModel 
     fields = ('field_1', 'field_2', 'field_3', ...) 
     widgets = { 
      # CHANGE THE WIDGETS HERE IF YOU WANT TO 
      'field_1': Textarea(attrs={'cols': 80, 'rows': 20}), 
     } 
     labels ={ 
      # CHANGE THE LABELS HERE IF YOU WANT TO 
     } 

Mehr Infos an Djangos modelForm docs: Overriding defaults field

+0

Dank dieser ist ziemlich gut funktioniert, obwohl ich nicht sicher bin, wie hier das Feld hinzufügen in das war der RegEx-Typ wie dieser: group_phone = forms.RegexField (regex = r '^ (\ + \ d {1,2} \ s)? \ (? \ d {3} \)? [\ s.- ]? \ d {3} [\ s .-]? \ d {4} $ ', error_message = ("Telefonnummer muss im Format:' 555-555-5555 oder 5555555555 'eingegeben werden. Bis zu 15 Ziffern erlaubt. "), widget = forms.TextInput (attrs = {'tabindex': '13', 'Platzhalter': '555-555-5555 oder 5555555555'})) – Codejoy

+0

Sie können diese Felder explizit definieren, stellen Sie lediglich sicher, dass Ihre Validierung Ihr Modell respektiert. Sie können entweder 'RegexField' sein, wie Sie es haben, oder sie können' CharField' mit Validatoren sein. Es gibt ein Validator-Beispiel am unteren Ende des [überschreibenden Standardbereiches] (https://docs.djangoproject.com/en/1.9/topics/forms/modelforms/#overriding-the-default-fields), aber es ist nicht notwendig, Sie können sie jedoch wie gewünscht überschreiben. –

+0

Das hat es geschafft, das funktioniert super danke! – Codejoy