我需要一些关于以下最佳实践实施的指导。
我有一个方案,我正在构建一个应用程序,但如果它匹配某个“类别”或“区域设置”,并希望将其重定向到其他之间的页面,只需转到正常路线。
这是我简单的views.py
if form.is_valid():
...
kwargs = {'project_id':project_id, 'categories':request.POST['categories'], 'locale':request.POST['locale']}
process_se(request, **kwargs)
return HttpResponseRedirect(obj.next_url)
这是我在models.py文件中的内容,但似乎非常不一致。 有没有更好的方法来处理这个请求?
def process_se(self, request, **kwargs):
if "All" or "Sweden" in kwargs['locale']:
if "Technology" or "Internet" in kwargs['categories']:
next_url = request.build_absolute_uri(reverse('project_new_se', kwargs={'project_id': self.id}))
else:
next_url = request.build_absolute_uri(reverse('project_new_step2', kwargs={'project_id': self.id}))
self.next_url = next_url
更新
我正在使用forms.ModelForm
,categories
和locales
是ManyToManyField
的
我在shell中模拟了一个for,但似乎仍然没有结果
这是cleaning_data输出
f.cleaned_data
{'locale': [<Locale: Sweden>, <Locale: All>], 'categories': [<Category: Technology>, <Category: Internet>]}
虽然为表单中的字段运行此操作似乎根据您的解决方案呈现完美正常
答案 0 :(得分:3)
我最初建议将此代码放在表单类中,但ApPeL修改了问题,指出locale
和categories
是模型上的多对多字段。所以现在我建议在你的模型中添加这样的方法:
def requires_swedish_setup(self):
"""
Return True if this project requires extra Swedish setup.
"""
return (self.locale.filter(name__in = ('All', 'Sweden')).exists())
and self.categories.filter(name__in = ('Technology', 'Internet')).exists())
然后像这样实现你的观点:
if form.is_valid():
project = form.save()
next = 'project_new_step2'
if project.requires_swedish_setup():
next = 'project_new_se'
next_url = reverse(next, kwargs={'project_id': project.id})
return HttpResponseRedirect(next_url)
一些注意事项:
我假设Locale
和Category
个对象有name
个字段(如果没有,请使用包含您正在测试的名称的任何字段)。
从request.POST
读取表单数据并不是一个好主意(小部件没有机会运行,并且尚未经过验证):最好使用{{1} }。
在这种情况下,您无需致电form.cleaned_data
:可以将request.build_absolute_uri
的结果直接提供给reverse
。
HttpResponseRedirect
可能不是你的意思:它像"All" or "Sweden" in kwargs['locale']
一样分析,所以总是如此。