因此,我花了整整一天的时间尝试寻找我想使用FormView实现的自定义功能。当我将FormView与HTML形式method =“ POST”一起使用时,大多数情况下我都能得到所需的结果。
如果用户单击提交表单,并且存在空白字段,则他们将收到一条错误消息,告知他们需要该表单。我知道我可以在表单上创建ModelChoiceField,但是正在尝试实现自己的逻辑。
我通过搜索发现,如果我不通过表单进行任何更新,则表单方法=“ GET”可能更合适。因此,我切换到该方法,基本上使此方法起作用,但是我的错误逻辑仍然无法按我期望的方式工作。
长话短说,我可以使用表单方法=“ GET”,但是当我尝试在表单上进行验证时,它不起作用。更糟糕的是,如果我尝试包含一个空标签,这将创建无效的文字消息,因为基于此SO ... In a Django template, how to specify a dictionary key which is itself an attribute?如果第一个字段本质上似乎无法指定错误逻辑/验证,为空,这是为了在ModelChoiceField上创建空白的首选。
这是我的代码...
表格...
dropdown = forms.ModelChoiceField(queryset=Author.objects.filter(is_active=True),required=False)
def __init__(self, *args, **kwargs):
# q = kwargs.pop('dropdown', None)
dropdown = kwargs.pop('dropdown', None)
super(AuthorByNameForm, self).__init__(*args, **kwargs)
self.fields['dropdown'].empty_label = ''
HTML ...
<form method="GET" action="{% url 'Main:author_detail' %}">
<h1 class="class">View By Author</h1>
<div>
{{ form.dropdown }}
</div>
视图... FORMVIEW
class AuthorByNameView(LoginRequiredMixin,FormView):
form_class = AuthorNameForm
template_name = 'author_by_name.html'
def get_form_kwargs(self):
kwargs = super(AuthorByNameView, self).get_form_kwargs()
kwargs['dropdown'] = self.request.GET.get("dropdown")
return kwargs
DetailView ....
class AuthorDetailView(LoginRequiredMixin,DetailView):
model = Author
template_name = 'author_detail.html'
def get_object(self, queryset=None):
return get_object_or_404(Author, id=self.request.GET.get("dropdown"))
return get_object_or_404
模型...
基本上只是用户...与UserProfile一对一...
class UserProfile(models.Model):
user = models.OneToOneField(User,on_delete=models.CASCADE)
基本上,如果我从表单中删除了empty_label行,则只要queryset不为空,该表单就会生效。如果我包含代码的empty_label行,并且用户在未选择任何内容的情况下单击了“提交”按钮,则他们将收到以int()为基数10:''消息的无效文字。解决此问题的唯一方法似乎是使用empty_label引用使ModelChoiceField required = True。
我知道,使用request.GET的行为似乎与POST有所不同。当我改用POST时,一切都可以按照我的期望进行,但似乎没有一种方法可以防止用户单击“后退”按钮时出现的错误消息。
我今天探索了一些Java脚本解决方案,这些解决方案已通过此SO推荐, How To Clear self.add_error in Django if user clicks on browser back button?,但无济于事。
还有其他人遇到过这场斗争吗?根据到目前为止的知识,在这种情况下,由于我没有更新有问题的记录并仅显示它们,因此表单method =“ GET”似乎是最有意义的,但是对于关于如何在ModelChoiceField中保持空白的第一位置以及如何在不涉及无效文字消息的情况下对相关字段进行任何类型的验证的我的选择。
预先感谢您的任何想法。
答案 0 :(得分:0)
def get_object(self, queryset=None):
foo = get_object_or_404(Author, id=self.request.GET.get("dropdown"))
return foo
嗯,我有点困惑,但这两个返回语句看起来不对。试试上面的东西。另外:
self.fields['dropdown'].empty_label = None
答案 1 :(得分:0)
利用此SO .... How to prevent submitting the HTML form's input field value if it empty,我能够确定实现此目标的最佳方法是在我的代码中添加以下Javascript ...
$('form').submit(function() {
var dropdown = $('#id_dropdown').val();
if (dropdown === undefined || dropdown === "") {
$('#id_dropdown').attr('name', '' );
} else {
$('#id_dropdown').attr('name', 'dropdown');
}
});
});
上面的代码强制使用404而不是我之前收到的无效文字消息。