1

Ich habe ein seltsames Problem bei der Implementierung von ChoiceField und UpdateView in Django. Ich habe einen kleinen Clip gemacht, der das Problem zeigt, vor dem ich stehe. Bitte sehen Sie es mit Untertitel/cc aktiviert. Es wird eine Vorstellung von dem Problem geben, vor dem ich stehe. https://youtu.be/M36TnlJvrZs. Das Problem geht so .....Django UpdateView und ChoiceField Problem. Django 1.11 Python 3.6

Während CreateView, habe ich das 'Geschlecht' ChoiceField als 'weiblich'. Aber in UpdateView vorbesetzt es die 'Geschlecht' ChoiceField als Male.

jedoch Die ListView macht das ‚Geschlecht‘ Feld richtig als ‚weiblich‘.

Und die django Admin-Panel, zeigt seltsamerweise gar keinen Wert für das 'Geschlecht' Feld.

Hier sind alle Codes:

models.py:

from django.db import models 
from django.core.urlresolvers import reverse 

gender_choices = (('Male', 'Male'), ('Female', 'Female')) 

class Birth(models.Model): 
    full_name = models.CharField(max_length = 100)  
    gender = models.CharField(max_length=6, choices=gender_choices) 
    date_of_birth = models.DateField() 
    place_of_birth = models.CharField(max_length = 50) 
    mother_name = models.CharField(max_length = 50) 
    father_name = models.CharField(max_length = 50) 
    address_at_time_of_birth = models.TextField(max_length = 500) 
    permanent_address = models.TextField(max_length = 500) 
    registration_no = models.CharField(max_length = 50) 
    remarks = models.CharField(max_length = 200)  
    registration_date = models.DateField() 
    issue_date = models.DateField() 

    def get_absolute_url(self): 
     return reverse('birth:birth_update', kwargs={'pk':self.pk}) 
     #return reverse('birth:birth_home') 

    def __str__(self): 
     return self.full_name 

forms.py:

from django import forms 
from .models import *  

class BirthForm(forms.ModelForm): 
     full_name = forms.CharField() 
     gender = forms.ChoiceField(choices = gender_choices, widget=forms.Select()) 
     date_of_birth = forms.DateField(widget = forms.DateInput(attrs = {'placeholder':'DD/MM/YYYY'})) 
     place_of_birth = forms.CharField() 
     mother_name = forms.CharField() 
     father_name = forms.CharField() 
     address_at_time_of_birth = forms.CharField(widget = forms.Textarea()) 
     permanent_address = forms.CharField(widget = forms.Textarea()) 
     registration_no = forms.CharField(required = False) 
     registration_date = forms.DateField(required = False, widget = forms.DateInput(attrs = {'placeholder':'DD/MM/YYYY'})) 
     remarks = forms.CharField(required = False) 
     issue_date = forms.DateField(required = False, widget = forms.DateInput(attrs = {'placeholder':'DD/MM/YYYY'})) 


     class Meta: 
      model = Birth 
      fields = '__all__' 

views.py:

from django.views.generic import ListView, CreateView, UpdateView 
from .models import * 
from .forms import * 
from datetime import date 


class BirthHome(ListView): 
    template_name = 'birth/birth_home.html' 
    model = Birth 
    context_object_name = 'birth_objects' 
    paginate_by = 20 

    def get_queryset(self): 
     return Birth.objects.all().order_by('-id') 


class NewBirth(CreateView): 
    model = Birth 
    form_class = BirthForm 
    #fields = '__all__' 
    template_name = 'birth/birth_add.html' 


    def form_valid(self, form): 
     obj = form.save(commit = False) 
     if not obj.registration_date: 
      obj.registration_date = date.today() 
     if not obj.issue_date: 
      obj.issue_date = date.today() 
     if not (date(1900, 1, 1) <= obj.date_of_birth <= date.today()): 
      form.add_error('date_of_birth', 'Please enter a valid date') 
      return super(NewBirth, self).form_invalid(form) 
     obj.full_name = obj.full_name.upper() 
     obj.gender = obj.gender.upper() 
     obj.place_of_birth = obj.place_of_birth.upper() 
     obj.mother_name = obj.mother_name.upper() 
     obj.father_name = obj.father_name.upper() 
     obj.address_at_time_of_birth = obj.address_at_time_of_birth.upper() 
     obj.permanent_address = obj.permanent_address.upper() 
     if obj.remarks: 
      obj.remarks = obj.remarks.upper() 
     self.object = form.save() 
     return super(NewBirth, self).form_valid(form) 


class BirthUpdate(UpdateView): 
    model = Birth 
    form_class = BirthForm 
    template_name = 'birth/birth_update.html' 

    def form_valid(self, form): 
     obj = form.save(commit = False) 
     if not obj.registration_date: 
      obj.registration_date = date.today() 
     if not obj.issue_date: 
      obj.issue_date = date.today() 
     if not (date(1900, 1, 1) <= obj.date_of_birth <= date.today()): 
      form.add_error('date_of_birth', 'Please enter a valid date') 
      return super(BirthUpdate, self).form_invalid(form) 
     obj.full_name = obj.full_name.upper() 
     obj.gender = obj.gender.upper() 
     obj.place_of_birth = obj.place_of_birth.upper() 
     obj.mother_name = obj.mother_name.upper() 
     obj.father_name = obj.father_name.upper() 
     obj.address_at_time_of_birth = obj.address_at_time_of_birth.upper() 
     obj.permanent_address = obj.permanent_address.upper() 
     if obj.remarks: 
      obj.remarks = obj.remarks.upper() 
     self.object = form.save() 
     return super(BirthUpdate, self).form_valid(form) 

Ich suchte ein viel und experimentierte auch viel, aber zu kein Erfolg. Ich brauche dringend Hilfe. Auch wenn dieser Ansatz nicht korrekt ist, was sollte der richtige Arbeitsansatz sein?

+0

Entfernen Sie diese Zeile 'obj.gender = obj.gender.upper()' und versuchen Sie es erneut. – xyres

Antwort

0

Gelöst!

Also nach vielen Experimenten erkannte ich, was das Problem war !! Es war in models.py Datei:

Da war ich Umwandlung all meine Eingaben in Großbuchstaben, die ‚Entscheidungen‘ Tupel auch die Werte in Großbuchstaben haben muß. Zunächst Tupel die gender_choices wie folgt lesen:

gender_choices = (('Male', 'Male'), ('Female', 'Female')) 

Und in meinen Ansichten, ich war das Geschlecht als Groß machen, damit Fehlanpassung in den deklarierten Tupeldaten und Formulardaten verursachen.

Also änderte ich das Tupel dazu:

gender_choices = (('MALE', 'MALE'), ('FEMALE', 'FEMALE')) 

funktioniert wie ein Charme !! Prost .... Danke für die Hilfe und Anregungen. Jede Rückmeldung ist immer willkommen :)

Verwandte Themen