使用枚举在Django中从下拉菜单获取主题

2 投票
1 回答
1418 浏览
提问于 2025-04-18 01:12

我有一个联系表单,其中有一个主题下拉菜单,主题有三种不同的选项:

1. 我有一个问题。

2. 帮助/支持

3. 请给我打电话。

当用户发送消息时,必须从这三种选项中选择一个,下面是我的代码:

*forms.py*

从django_enumfield导入enum

class SubjectEnum(enum.Enum):
    subject_one = 'I have a question'
    subject_two = 'Help/Support'
    subject_three = 'Please give me a call'

class ContactForm(forms.ModelForm):
    name = forms.CharField(required=True)
    email = forms.EmailField(required=True)
    subject = forms.TypedChoiceField(choices=SubjectEnum.choices(), coerce=str) 
    message = forms.CharField(widget=forms.Textarea)




   def __init__(self, *args, **kwargs):
        self.helper = FormHelper()
        self.helper.add_input(Submit('submit', 'Submit'))
        super(ContactForm, self).__init__(*args, **kwargs)

还有view.py文件如下:

class ContactFormView(FormView):
    form_class = ContactForm
    template_name = "contact/email_form.jade"
    success_url = '/email-sent/'

    def form_valid(self, form):
        message = "{name} / {email} said: ".format(
            name=form.cleaned_data.get('name'),
            email=form.cleaned_data.get('email'))
        message += "\n\n{0}".format(form.cleaned_data.get('message'))
        send_mail(
            subject=form.cleaned_data.get('-subject').strip(),
            message=message,
            from_email="enquiries@example.com",
            recipient_list=[settings.LIST_OF_EMAIL_RECIPIENTS],
        )
        return super(ContactFormView, self).form_valid(form)

联系表单:

- extends "base.jade"
- load crispy_forms_tags
    block meta_title
        | Contact Us
    block content
        .jumbotron
            h1 Contact Us
        .row
            .span6
                {% crispy form form.helper %}

我遇到了一个错误,提示说:ValueError: ModelForm没有指定模型类。大家有什么想法吗?谢谢!

1 个回答

2

你需要在你的模型表单里指定一个 Meta 类,并设置使用的模型。注意,如果表单字段和模型字段没有不同,你就不需要再单独指定那些字段。

class ContactForm(forms.ModelForm)
    name = forms.CharField(required=True)
    email = forms.EmailField(required=True)
    subject = forms.TypedChoiceField(choices=SubjectEnum.choices(), coerce=str) 
    message = forms.CharField(widget=forms.Textarea)

    class Meta:
        model = Contact
        fields = ['name', 'email', 'subject', 'message']

如果你没有一个叫 Contact 的模型,那你应该使用 Form 而不是 ModelForm

class ContactForm(forms.Form):
    name = forms.CharField(required=True)
    email = forms.EmailField(required=True)
    subject = forms.TypedChoiceField(choices=SubjectEnum.choices(), coerce=str) 
    message = forms.CharField(widget=forms.Textarea)

   def __init__(self, *args, **kwargs):
        self.helper = FormHelper()
        self.helper.add_input(Submit('submit', 'Submit'))
        super(ContactForm, self).__init__(*args, **kwargs)

查看文档,了解更多关于 ModelForm 的信息和使用方法。

撰写回答