繁体   English   中英

Django形成ChoiceField而不选择所需值

[英]Django forms ChoiceField not selecting the wanted value

我创建了一个django表单(IssueForm),该表单用于注册一个对象,该对象是我的一个模型(Issue)的实例。 以下是模型:

模型

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  

使用的形式:

表格

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入手,无法自行解决。
感谢您的时间!!

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

请注意,您在这里所做的工作也远远超出了必要。 您的save方法完全复制了超类已经完成的工作; 您应该删除所有代码,但用户值的设置除外。

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'
        ]

不要忘记删除sissue_field ;)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM