python - django - 如果提交的表单值为 X,则阻止表单提交

标签 python django django-forms django-views

我正在使用 Django 1.4.6 和 python 2.7。

我有一个测试表单,允许用户从选择列表中输入数据:

<select name="language_code" id="id_language_code">
    <option value="en-CA">English (Canada) - English (Canada)‎</option>
    <option value="en-GB" selected="selected">English (UK) - English (UK)‎</option>
    <option value="en">English (US)</option>
    <option value="fr-CA">French (Canada) - français (Canada)‎</option>
    <option value="fr">French (France) - français (France)‎</option>
</select>

表单提交工作正常。

但是,我需要进行更改,以便如果用户选择 fr-CA 的选择列表选项然后提交表单,那么我不想添加记录并将用户重定向到不同的表单 -返回重定向(settings.MENU_DETAIL_LINK_NAME_DETAILS)。

本质上,如果 LanguageVersion 模型的 bool 字段 language_code_disabled 为 true,则用户应该无法添加语言版本。

我不太确定该怎么做。我一直在这个问题上兜圈子,所以我对如何实现这一目标感到困惑。

这是我的模型代码:

class NameDetails(models.Model, FillableModelWithLanguageVersion):
    user = models.ForeignKey(User)
    language_version = models.ForeignKey('LanguageVersion')
    name_details_prefix_title = models.CharField(null=True, blank=True, max_length=25)
    name_details_first_name = models.CharField(null=False, blank=False, max_length=50)
    name_details_middle_name = models.CharField(null=True, blank=True, max_length=100)
    name_details_last_name = models.CharField(null=False, blank=False, max_length=60)
    name_details_suffix_title = models.CharField(null=True, blank=True, max_length=25)

class LanguageVersion(models.Model):
    """Language version selection for a user"""
    user = models.ForeignKey(User)
    language_code = models.CharField(max_length=32)
    language_code_disabled = models.BooleanField(default=False)

这是我的观点.py

@login_required
def name_details_add(request):
    language_versions = LanguageVersion.objects.filter(user=request.user)
    available_languages = get_available_language_details(language_versions, request.user.userprofile.language_preference)
    name_details_num = request.user.namedetails_set.count()
    preview_labels = get_name_details_labels(available_languages)
    if name_details_num >= settings.MAX_NAME_DETAILS:
        return redirect(settings.MENU_DETAIL_LINK_NAME_DETAILS)
    if request.method == 'GET':
        form = NameDetailsForm(
            available_languages=available_languages,
            language_preference=request.user.userprofile.language_preference,)
    elif request.method == 'POST':
        form = NameDetailsForm(
            available_languages=available_languages,
            language_preference=request.user.userprofile.language_preference,
            data=request.POST)
        if form.is_valid() and name_details_num < settings.MAX_NAME_DETAILS:
            name_detail = NameDetails(user=request.user)
            name_detail.fill(form.cleaned_data)
            name_detail.save()
            messages.success(request, _('successfully added.'))
            return redirect(settings.MENU_DETAIL_LINK_NAME_DETAILS)

我希望有人能帮助我解决这个问题。

我需要找出如何从 language_code_disabled 为 True 的用户的 LanguageVersions 模型中调用所有语言代码的列表。

我是否可以编写一个循环遍历语言版本的函数,或者可以编写一个简单的调用函数来返回禁用的语言代码列表,例如 en、fr、fr-CA、de ?

disabled_language_versions = LanguageVersion.objects.filter(user=request.user, language_code_disabled=True)

最佳答案

您可以在表单上添加 LanguageVersion fk 的字段验证,并在 View 中访问该信息:

class NameDetailsForm(forms.ModelForm):
    ...
    def clean_language_version(self):
        lang = self.cleaned_data.get('language_version')
        if LanguageVersion.objects.filter(language_code=lang, language_code_disabled=True).exists():
            raise forms.ValidationError("Language code disabled")
        return lang

然后在 View 中:

if form.is_valid() ... :
    ...
elif form['language_version'].errors:
    return redirect(settings.MENU_DETAIL_LINK_NAME_DETAILS)

关于python - django - 如果提交的表单值为 X,则阻止表单提交,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27594625/

相关文章:

python - 如何打印值之间没有空格的变量

django - 如何解决 'ValidationError'对象没有属性 'strip'问题?

django - 编写自定义 Django 小部件的教程?

python - 我如何要求此 Django View 使用 HTTPS?

javascript - 在ajax中提交多部分表单?

python - 如何在自定义用户模型 Django 中修复 "Invalid password format or unknown hashing algorithm."

python - POST 数据中缺少 Django 表单输入

python - 需要在 Flask 中编写 View 函数的代码方面的帮助 - Python Web 框架

Python ldap3如何获取组的所有成员

Python manage.py runserver 使用 python 3.9,基本 OS 5.1.7 Hera 给出引发 ImportError ('win32 only' 的错误 ImportError : win32 only,