我有两个型号
class MyClients(models.Model):
user=models.ForeignKey(User)
client_name=models.CharField(max_length=100)
client_address=models.CharField(max_length=100,null=True, blank=True)
class MyIvoice(models.Model):
user=models.ForeignKey(User)
my_client=models.ForeignKey(MyClients)
在表单中,将显示foreignkey(MyClients)中的所有对象,但我只想过滤用户列出的客户端的名称,而不是Myclient模型中的所有客户端。我怎样才能在模特中实现这一点?
我知道我可以在视图中执行此操作但是可以在模型中完成吗?因为我希望用户在表单中选择一个客户端。
答案 0 :(得分:1)
在模型上执行此操作是不正确的,您希望在表单上执行此操作。
如果您已经知道表单的用户实例,则可以在类级别使用queryset
kwarg(在定义字段时):
client = forms.ModelChoiceField(queryset=MyClients.objects.filter(user=my_user))
但是,如果您在创建时只能访问用户实例,那么您仍然可以稍后覆盖查询集(通常在__init__
中):
self.fields['client'].queryset = MyClients.objects.filter(user=my_user)
答案 1 :(得分:1)
在表单部分添加 init 功能:
class MyForm(forms.Form, FormMixin):
def __init__(self, *args, **kwargs):
user = kwargs.pop('user', None)
self.user = user
super(MyForm, self).__init__(*args, **kwargs)
# do stuff
self.fields['myclient'].queryset = user.myclient_set.all()
然后在视图部分中添加user=request.user
作为表单arg。
def my_view(request, id=None):
# do stuff to get your instance
form = MyForm(request.POST or None, instance=instance, user=request.user)
答案 2 :(得分:0)
您可以使用相关名称:
# Gets all MyClient objects for a user
user.myclient_set.all()
我不完全确定你为什么要在模型上这样做,这种逻辑的地方就是形式。