1

私はdjangoでChoiceFieldとUpdateViewを実装する際に奇妙な問題に直面しています。私は、私が直面している問題を示す小さなクリップを作った。字幕/ ccを有効にしてご覧ください。それは、私が直面している問題についての考えを与えるでしょう。 https://youtu.be/M36TnlJvrZs。問題はこのように書きます..... CreateView中にDjango UpdateViewとChoiceFieldの問題です。 Django 1.11 python 3.6

は、私が '女性' として '性別' ChoiceFieldを設定します。しかし、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')) 

作品!!乾杯....そしてすべての助けと提案のために、やっぱり。フィードバックはいつでも歓迎します:)

関連する問題