2017-07-24 56 views
1

我创建了一个django表单(IssueForm),它是用来注册一个对象,它是我的一个模型(Issue)的实例。以下是该型号:Django形成ChoiceField不选择想要的值

model.py

class Issue(models.Model): 

TYPE_FIELDS = [ 
    ("Math", "Math"), 
    ("Physics", "Physics"), 
    ("Programming", "Programming"), 
    ("Arts", "Arts") 
] 

issue_text = models.TextField(default="Please insert text") 
issue_description = models.TextField(default="Newly created") 
issue_deadline = models.DateField() 
issue_field = models.CharField(max_length=30, choices=TYPE_FIELDS) 
published_by = models.ForeignKey(User, on_delete=models.CASCADE, default=None) 

def __str__(self): 
    return self.issue_description 

使用形式:

forms.py

class IssueForm(forms.ModelForm): 

def __init__(self, user, *args, **kwargs): 
    self.user = user 
    super(IssueForm, self).__init__(*args, **kwargs) 

TYPE_FIELDS = [ 
    ("Math", "Math"), 
    ("Physics", "Physics"), 
    ("Programming", "Programming"), 
    ("Arts", "Arts") 
] 

issue_text = forms.CharField(widget=forms.Textarea, required=True) 
issue_description = forms.CharField(widget=forms.Textarea, required=True) 
issue_deadline = forms.DateField(required=True) 
issue_fields = forms.ChoiceField(choices=TYPE_FIELDS, required=True) 

class Meta: 
    model = Issue 
    fields = [ 
     'issue_text', 
     'issue_description', 
     'issue_deadline', 
     'issue_fields' 
    ] 

def save(self, commit=True): 
    issue = super(IssueForm, self).save(commit=False) 
    issue.issue_text = self.cleaned_data['issue_text'] 
    issue.issue_description = self.cleaned_data['issue_description'] 
    issue.issue_deadline = self.cleaned_data['issue_deadline'] 
    issue.issue_fields = self.cleaned_data['issue_fields'] 

    if commit: 
     issue.published_by = self.user 
     issue.save() 

    return issue 

和相关观点:

种views.py

def create_issue(request): 
if ExtendedUser.objects.filter(user=request.user).exists(): 
    if request.method == 'POST': 
     form = IssueForm(request.user, request.POST) 
     if form.is_valid(): 
      form.save() 
     return redirect("/issues") 
    else: 
     form = IssueForm(request.user) 
     args = {'form': form} 
     return render(request, "issues/create_issue.html", args) 
else: 
    raise Http404("You are not allowed to perform this action") 

的形式适用于各个领域的模型,他们都是注册权,除了issue_fields。如果我尝试给模型中的字段赋予一个默认值,那就是保存在数据库中的值,否则我只会得到一个空字段。此外,我相信问题来自于使用的形式,因为如果我尝试从django管理界面创建新的issue,它工作得很好。
我觉得它是那些愚蠢的错误之一,但我只是从一般的Django和Python开始,并不能自行解决。
谢谢你的时间!

回答

0

模型上的字段名为issue_field,但您设置了issue_fields

请注意,您在这里所做的工作远远超过必要。你的save方法完全重复了超类的作用;除了设置用户值之外,您应该删除所有代码。

+0

哦,上帝,非常感谢你,这让我疯狂。也谢谢你的头! –

0

enter code here如果你想使用Choices,你不必在forms.py文件中再写一个选项列表。

这是一个例子:

#In your models.py file 

LIST_CHOICE = (('A','A'), ('B','B')) 

class Test(models.Model) : 

    foo = models.CharField(choices=LIST_CHOICE, verbose_name="foo") 

#In your form.py file 

TestForm(forms.Modelform) : 

    class Meta : 
     model = Test 
     fields = ['foo'] 

这是没有必要在你的表单文件覆盖LIST_CHOICE;)

所以,不要触摸到你的model.py文件,但在你的form.py文件中,只写:

class IssueForm(forms.ModelForm): 

    issue_text = forms.CharField(widget=forms.Textarea) 
    issue_description = forms.CharField(widget=forms.Textarea) 

    def __init__(self, user, *args, **kwargs): 
     self.user = user 
     super(IssueForm, self).__init__(*args, **kwargs) 


    class Meta: 
     model = Issue 
     fields = [ 
      'issue_text', 
      'issue_description', 
      'issue_deadline', 
      'issue_fields' 
     ] 

不要忘记删除issue_fields;)