Django:ForeignKey限制\u选项\u等于当前对象的客户端

Django:ForeignKey限制\u选项\u等于当前对象的客户端,django,django-models,Django,Django Models,给定这两个模型,我希望我的url FK in ClientKeyword只显示其客户端等于当前ClientKeyword的客户端的url 我应该限制什么样的选择 现在看起来是这样的: 类ClientUrlmodels。模型: client=models.ForeignKeyUpstreamClientModel url=models.URLFieldunique=True,null=False 活动=模型。BooleanFielddefault=真 def _unicode__self: 返回s

给定这两个模型,我希望我的url FK in ClientKeyword只显示其客户端等于当前ClientKeyword的客户端的url

我应该限制什么样的选择

现在看起来是这样的:

类ClientUrlmodels。模型: client=models.ForeignKeyUpstreamClientModel url=models.URLFieldunique=True,null=False 活动=模型。BooleanFielddefault=真 def _unicode__self: 返回self.url 类元: 详细名称='url' 关键字类型= ‘MN’、‘Money’, ‘BR’、‘Brand’, “LT”,“长尾”, 类ClientKeywordmodels。模型: client=models.ForeignKeyUpstreamClientModel kw_type=models.charfield关键字类型,最大长度=2, 选项=关键字类型,默认值='LT' 关键字=models.CharFieldmax_length=150,unique=True TODO:关键字parent ManyToManyFieldself url=models.ForeignKeyClientUrl,将选项限制为={'client':client} 我可以进行迁移,django没有抱怨,但当我尝试从管理界面添加新关键字时,我得到了以下回溯:

File "/Users/mirkocrocop/.virtualenvs/upstream_backend/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response
  111.                         response = callback(request, *callback_args, **callback_kwargs)
File "/Users/mirkocrocop/.virtualenvs/upstream_backend/lib/python2.7/site-packages/django/contrib/admin/options.py" in wrapper
  366.                 return self.admin_site.admin_view(view)(*args, **kwargs)
File "/Users/mirkocrocop/.virtualenvs/upstream_backend/lib/python2.7/site-packages/django/utils/decorators.py" in _wrapped_view
  91.                     response = view_func(request, *args, **kwargs)
File "/Users/mirkocrocop/.virtualenvs/upstream_backend/lib/python2.7/site-packages/django/views/decorators/cache.py" in _wrapped_view_func
  89.         response = view_func(request, *args, **kwargs)
File "/Users/mirkocrocop/.virtualenvs/upstream_backend/lib/python2.7/site-packages/django/contrib/admin/sites.py" in inner
  196.             return view(request, *args, **kwargs)
File "/Users/mirkocrocop/.virtualenvs/upstream_backend/lib/python2.7/site-packages/django/utils/decorators.py" in _wrapper
  25.             return bound_func(*args, **kwargs)
File "/Users/mirkocrocop/.virtualenvs/upstream_backend/lib/python2.7/site-packages/django/utils/decorators.py" in _wrapped_view
  91.                     response = view_func(request, *args, **kwargs)
File "/Users/mirkocrocop/.virtualenvs/upstream_backend/lib/python2.7/site-packages/django/utils/decorators.py" in bound_func
  21.                 return func(self, *args2, **kwargs2)
File "/Users/mirkocrocop/.virtualenvs/upstream_backend/lib/python2.7/site-packages/django/db/transaction.py" in inner
  209.                 return func(*args, **kwargs)
File "/Users/mirkocrocop/.virtualenvs/upstream_backend/lib/python2.7/site-packages/django/contrib/admin/options.py" in add_view
  932.         ModelForm = self.get_form(request)
File "/Users/mirkocrocop/.virtualenvs/upstream_backend/lib/python2.7/site-packages/django/contrib/admin/options.py" in get_form
  459.         return modelform_factory(self.model, **defaults)
File "/Users/mirkocrocop/.virtualenvs/upstream_backend/lib/python2.7/site-packages/django/forms/models.py" in modelform_factory
  407.     return form_metaclass(class_name, (form,), form_class_attrs)
File "/Users/mirkocrocop/.virtualenvs/upstream_backend/lib/python2.7/site-packages/django/forms/models.py" in __new__
  206.                                       opts.exclude, opts.widgets, formfield_callback)
File "/Users/mirkocrocop/.virtualenvs/upstream_backend/lib/python2.7/site-packages/django/forms/models.py" in fields_for_model
  164.             formfield = formfield_callback(f, **kwargs)
File "/Users/mirkocrocop/.virtualenvs/upstream_backend/lib/python2.7/site-packages/django/contrib/admin/options.py" in formfield_for_dbfield
  107.                 formfield = self.formfield_for_foreignkey(db_field, request, **kwargs)
File "/Users/mirkocrocop/.virtualenvs/upstream_backend/lib/python2.7/site-packages/django/contrib/admin/options.py" in formfield_for_foreignkey
  168.         return db_field.formfield(**kwargs)
File "/Users/mirkocrocop/.virtualenvs/upstream_backend/lib/python2.7/site-packages/django/db/models/fields/related.py" in formfield
  1005.             'queryset': self.rel.to._default_manager.using(db).complex_filter(self.rel.limit_choices_to),
File "/Users/mirkocrocop/.virtualenvs/upstream_backend/lib/python2.7/site-packages/django/db/models/query.py" in complex_filter
  660.             return self._filter_or_exclude(None, **filter_obj)
File "/Users/mirkocrocop/.virtualenvs/upstream_backend/lib/python2.7/site-packages/django/db/models/query.py" in _filter_or_exclude
  642.             clone.query.add_q(Q(*args, **kwargs))
File "/Users/mirkocrocop/.virtualenvs/upstream_backend/lib/python2.7/site-packages/django/db/models/sql/query.py" in add_q
  1250.                             can_reuse=used_aliases, force_having=force_having)
File "/Users/mirkocrocop/.virtualenvs/upstream_backend/lib/python2.7/site-packages/django/db/models/sql/query.py" in add_filter
  1185.                 connector)
File "/Users/mirkocrocop/.virtualenvs/upstream_backend/lib/python2.7/site-packages/django/db/models/sql/where.py" in add
  69.             value = obj.prepare(lookup_type, value)
File "/Users/mirkocrocop/.virtualenvs/upstream_backend/lib/python2.7/site-packages/django/db/models/sql/where.py" in prepare
  320.             return self.field.get_prep_lookup(lookup_type, value)
File "/Users/mirkocrocop/.virtualenvs/upstream_backend/lib/python2.7/site-packages/django/db/models/fields/related.py" in get_prep_lookup
  137.             return self._pk_trace(value, 'get_prep_lookup', lookup_type)
File "/Users/mirkocrocop/.virtualenvs/upstream_backend/lib/python2.7/site-packages/django/db/models/fields/related.py" in _pk_trace
  210.         v = getattr(field, prep_func)(lookup_type, v, **kwargs)
File "/Users/mirkocrocop/.virtualenvs/upstream_backend/lib/python2.7/site-packages/django/db/models/fields/__init__.py" in get_prep_lookup
  310.             return self.get_prep_value(value)
File "/Users/mirkocrocop/.virtualenvs/upstream_backend/lib/python2.7/site-packages/django/db/models/fields/__init__.py" in get_prep_value
  537.         return int(value)

Exception Type: TypeError at /admin/clients/clientkeyword/add/
Exception Value: int() argument must be a string or a number, not 'ForeignKey'
更好的方法是:在模型的admin类中重写formfield_for_foreignkey

class ClientKeywordAdmin(admin.ModelAdmin):
    def get_form(self, request, obj=None, **kwargs):
        # store the model instance for later
        request.obj = obj
        return super(ClientKeywordAdmin, self).get_form(request, obj, 
                                                        **kwargs)

    def formfield_for_foreignkey(self, db_field, request=None, **kwargs):
        if db_field.name == 'url':
            # set the query set to whatever you like
            kwargs['queryset'] = request._obj.client.clienturls.all()
        return super(ClientKeywordAdmin, 
                     self).formfield_for_foreignkey(request, obj, **kwargs)

这实际上是我的一篇老文章,但我认为它会让你朝着正确的方向前进:谢谢,但是你最终是在你的模型中使用了limit_choices_to选项,还是仅仅通过编写一个自定义表单就解决了这个问题?而且您知道是否可以根据我选择的客户端更新URL列表吗?因为当我添加而不是编辑时,我会将过滤逻辑放在我在管理中使用的自定义表单中。您应该能够根据实例上存在的id对添加和更新进行选择性筛选。然而,当我说我想在选择客户时更新列表时,我的意思是。。。也许我可以用一些ajaxy的东西来做。当我添加一个新的关键字时,我还没有一个实例,但是一旦我从下拉列表中选择了客户端名称,我的url就会被更新。。。也许你能给我指出正确的方向-在admin中向列表添加新选项并不十分困难,但它会给您带来一些验证问题。据我所知,Django表单不会接受动态添加的选项。根据另一个字段中的值显示或隐藏选项也非常容易。如果您使用的是1.3或更高版本,jQuery可以作为admin的一部分使用,这为您提供了所需的一切。