我正在使用 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/