1

django에서 ChoiceField 및 UpdateView를 구현하는 중 이상한 문제가 있습니다. 내가 직면하고있는 문제를 보여주는 작은 클립을 만들었습니다. 자막/cc를 활성화 한 상태에서 시청하십시오. 제가 직면하고있는 문제에 대한 아이디어를 줄 것입니다. https://youtu.be/M36TnlJvrZs. 문제는 내가 '여성'로 ''ChoiceField을 설정 CreateView 동안 ..... 이런 식으로Django UpdateView 및 ChoiceField 문제입니다. Django 1.11 python 3.6

간다. 그러나 UpdateView에는 '성별'ChoiceField남성으로 미리 채워집니다.

그러나, ListView는 '여성'로 제대로 ''필드를 렌더링합니다.

그리고 이상하게 장고 관리자 패널

는 전혀 ' '필드에 대한 값을 표시하지 않습니다.

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) 

내가 검색 많은 것을 실험했지만 많은 것을 실험했습니다. 아무 소용이. 진지하게 도움이 필요합니다. 또한이 접근법이 정확하지 않은 경우, 올바른 작동 방식은 무엇입니까 ??

+0

이 줄'obj.gender = obj.gender.upper()'를 제거하고 다시 시도하십시오. – xyres

답변

0

해결!

많은 실험을 마친 후 문제가 무엇인지 깨달았습니다. 그것은 models.py 파일에 있었다 :

'선택' 튜플도 대문자로 값이 필요 내 모든 입력을 대문자로 변환하고, 이후

. 처음에는 gender_choices는 다음과 같이 읽을 튜플 :

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

그리고 내보기에

, 나는 이렇게 선언 된 튜플 데이터 및 폼 데이터에 잘못 일치하는 원인이 대문자로 성별을 만들고 있었다.

그래서,이에 튜플을 변경 : 마법처럼

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

작품! 건배 .... 그리고 모든 도움과 제안을위한 고맙습니다. 모든 의견은 언제나 환영합니다.