Python Django forms ChoiceField未选择所需值

Python Django forms ChoiceField未选择所需值,python,django,forms,choicefield,Python,Django,Forms,Choicefield,我创建了一个django表单(IssueForm),用于注册一个对象,该对象是我的一个模型(Issue)的实例。模型如下: model.py class Issue(models.Model): TYPE_FIELDS = [ ("Math", "Math"), ("Physics", "Physics"), ("Programming", "Programming"), ("Arts", "Arts") ] issue_text = models.TextF

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

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  
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  
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")  
使用的表格:

forms.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  
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  
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")  
以及有关的意见:

视图.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  
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  
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")  
表单适用于模型中的每个字段,它们都是注册正确的,除了
问题\ u字段
。如果我尝试为模型中的字段提供一个默认值,即保存在数据库中的值,否则我只会得到一个空字段。我还认为问题来自所使用的表单,因为如果我尝试从django管理界面创建一个新的
问题
,它就可以正常工作。
我觉得这是一个愚蠢的错误,但我只是从django和python开始,不能靠我自己解决。

谢谢你抽出时间

模型上的字段称为
issue\u字段
,但您可以设置
issue\u字段


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

模型上的字段称为
issue\u字段
,但您可以设置
issue\u字段


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

在此处输入代码
如果要使用
选项
,则无需在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")

无需覆盖表单文件中的列表选项;)

因此,不要接触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_字段中的
s

在此处输入代码
如果要使用
选项
,则无需在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")

无需覆盖表单文件中的列表选项;)

因此,不要接触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_字段中的
s

哦,上帝,非常感谢你,我快疯了。也谢谢你的提醒!!哦,上帝,非常感谢你,我快疯了。也谢谢你的提醒!!