2012-11-27 22 views
6

Bu iki model verildiğinde, URL'm (ClientKeyword içinde) yalnızca istemciyi geçerli ClientKeyword istemcisine eşit olan URL'leri göstermesini istiyorum.Django: ForeignKey limit_choices_to geçerli nesnenin istemcisine eşit

Ne yazmalıyım limit_choices_to?

Artık o şuna benzer:

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}) 

Ben göçler yapabileceğini ve django şikayeti yoktu, ama ben eklemeye çalıştığınızda yeni bir anahtar kelime aşağıdaki Traceback olsun yönetici arayüzü oluşturur:

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' 
+0

Bu (aslında benim) eski bir yazı olduğunu ama doğru yönde gidiyor alacak düşünüyorum: https://groups.google.com/forum/?fromgroups=#!topic/django- Kullanıcılar/s9a0J6fKgWs – Brandon

+0

teşekkürler, ama modellerinde limit_choices_to seçeneğini kullanarak bitirdiniz mi yoksa sadece özel bir form yazarak mı çözdünüz? Ayrıca, seçtiğim müşteriye bağlı olarak url listesini güncellemenin mümkün olup olmadığını biliyor musunuz? (düzenleme yerine eklerken yaptığım için) –

+0

Filtreleme mantığını yönetici olarak kullandığım özel bir formda koydum. Örnekte bir "id" varlığına dayalı olarak güncellemeye karşı ekleme için seçici filtre yapabilmeniz gerekir. – Brandon

cevap

6

daha da iyisi: bunu yapmak için daha fazla "official" yolu modelin yönetici sınıfında formfield_for_foreignkey() geçersiz etmektir.

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) 
İlgili konular