簡體   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