Với hai mô hình này, tôi muốn FK url của tôi (trong ClientKeyword) chỉ hiển thị các url có trình khách bằng ứng dụng ClientKeyword hiện tại.Django: ForeignKey limit_choices_to cho khách hàng của đối tượng hiện tại bằng
Tôi nên đặt gì trong limit_choices_to?
Ngay bây giờ nó trông như thế này:
class ClientUrl(models.Model):
client = models.ForeignKey(UpstreamClientModel)
url = models.URLField(unique=True, null=False)
active = models.BooleanField(default=True)
def __unicode__(self):
return self.url
class Meta:
verbose_name = 'url'
KEYWORD_TYPES = (
('MN', 'Money'),
('BR', 'Brand'),
('LT', 'Long Tail'),
)
class ClientKeyword(models.Model):
client = models.ForeignKey(UpstreamClientModel)
kw_type = models.CharField("keyword type", max_length=2,
choices=KEYWORD_TYPES, default='LT')
keyword = models.CharField(max_length=150, unique=True)
# TODO: keyword parent ManyToManyField("self")
url = models.ForeignKey(ClientUrl, limit_choices_to={'client': client})
tôi có thể làm công nhập cư và django không phàn nàn, nhưng khi tôi cố gắng thêm một từ khóa mới tạo ra giao diện quản trị tôi nhận được traceback sau:
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'
Đây là một bài đăng cũ hơn (của tôi thực sự) nhưng tôi nghĩ nó sẽ giúp bạn đi đúng hướng: https://groups.google.com/forum/?fromgroups=#!topic/django- người dùng/s9a0J6fKgWs – Brandon
cảm ơn, nhưng bạn đã kết thúc bằng cách sử dụng tùy chọn limit_choices_to trong các mô hình của bạn hay bạn đã giải quyết nó chỉ bằng cách viết một biểu mẫu tùy chỉnh? Ngoài ra, ... bạn có biết liệu có thể cập nhật danh sách các url tùy thuộc vào khách hàng tôi chọn không? (vì khi tôi thêm thay vì chỉnh sửa) –
Tôi đặt logic lọc theo biểu mẫu tùy chỉnh mà tôi đã sử dụng trong quản trị viên. Bạn có thể làm bộ lọc chọn lọc để thêm vào so với cập nhật dựa trên sự hiện diện của một 'id' trên cá thể. – Brandon