Django-避免形式上的重复
为了将选择限制到当前用户的集合,您必须执行以下操作:Django-避免形式上的重复,django,django-forms,django-admin,Django,Django Forms,Django Admin,为了将选择限制到当前用户的集合,您必须执行以下操作: class ChoiceForm(forms.ModelForm): def __init__(self, user, *args, **kwargs): super(ChoiceForm, self).__init__(*args, **kwargs) self.fields['poll'].queryset = Poll.objects.filter(owner=user) class M
class ChoiceForm(forms.ModelForm):
def __init__(self, user, *args, **kwargs):
super(ChoiceForm, self).__init__(*args, **kwargs)
self.fields['poll'].queryset = Poll.objects.filter(owner=user)
class Meta:
model = Choice
根据项目的规模,这可能会变得相当重复。。另外,你最终不得不对管理表单做同样的事情。可以避免这种情况吗?使用通用视图并定义一个
get_form
方法将用户添加到表单的kwarg中,然后创建一个自定义基表单类,该类接受额外的用户
kwarg,如下所示:
形式
看法
使用通用视图并定义一个
get_form
方法将用户添加到表单的kwarg中,然后创建一个接受额外user
kwarg的自定义基表单类,如下所示:
形式
看法
您可以覆盖默认管理器以返回过滤后的查询您可以覆盖默认管理器以返回过滤后的查询非常干净,并且绝对避免重复。。。我喜欢。谢谢你的帮助。非常干净,绝对避免重复。。。我喜欢。谢谢你的帮助。
class UserModelForm(ModelForm):
"""
Base form class with user-based FK filtering.
"""
def __init__(self, *args, **kwargs):
"""
Filters the queryset on foreign keys to limit to the provided user.
"""
# Pop the user from the kwargs
user = kwargs.pop('user')
# Delegate initilization to super using the remaining args and kwargs
super(UserModelForm, self).__init__(*args, **kwargs)
self.prepare_for_user(user)
def prepare_for_user(self, user):
"""
Handles user related setup - for use inside __init__ - abstracted
from __init__ to make testing easier.
"""
# Get the user's PK
user_pk = user.pk
# Filter foriegn key fields to records owned by the user
# Make a generator of the form's FK fields
fks = [f for f in self.fields.itervalues() if hasattr(f, 'queryset')]
# Iterate the FK fields and filter them - you might want to check
# for something like `if hasattr(field.queryset.model, 'user'):`, etc.
for field in fks:
field.queryset = field.queryset.filter(user_id=user_pk)
class MyView(object):
"""
A mixin for views.
"""
def get_form(self, form_class):
"""
Returns the provided form class, instantiated with the form kwargs,
adding a user kwarg.
"""
# Create some form kwargs with the user included
defaults = {'user': self.request.user}
# Update the kwargs with the default form kwargs
defaults.update(self.get_form_kwargs())
return form_class(**defaults)