2012-11-27 15 views
6

इन दो मॉडलों को देखते हुए को ForeignKey limit_choices_to, मैं अपने यूआरएल FK (ClientKeyword में) केवल करने के लिए यूआरएल जिसका ग्राहक वर्तमान ClientKeyword के ग्राहक के बराबर होती है दिखाने चाहते हैं।Django: बराबर वर्तमान वस्तु के ग्राहक

मैं limit_choices_to में क्या रखना चाहिए?

अभी यह इस तरह दिखता है:

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

मैं माइग्रेशन कर सकता है और 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' 
+0

यह एक पुराना पोस्ट (मेरा वास्तव में की) है, लेकिन मुझे लगता है कि आप सही दिशा में जा रहा हो जाएगी: https://groups.google.com/forum/?fromgroups=#!topic/django- उपयोगकर्ताओं/s9a0J6fKgWs – Brandon

+0

धन्यवाद, लेकिन आप अपने मॉडल में limit_choices_to विकल्प का उपयोग कर खत्म किया था या तुम सिर्फ एक कस्टम फ़ॉर्म लिख कर इसे हल किया? साथ ही, ... क्या आप जानते हैं कि क्लाइंट के आधार पर यूआरएल की सूची अपडेट करना संभव होगा? –

+0

(जब मैं संपादन के बजाय जोड़ रहा के लिए) मुझे लगता है कि मैं व्यवस्थापक में इस्तेमाल एक कस्टम रूप में छानने तर्क डाल दिया। उदाहरण के लिए आपको 'आईडी' की उपस्थिति के आधार पर अद्यतन बनाम अद्यतन के लिए चुनिंदा फ़िल्टर करने में सक्षम होना चाहिए। – Brandon

उत्तर

6

और भी बेहतर: अधिक "official" यह करने के लिए जिस तरह से अपने मॉडल के व्यवस्थापक कक्षा में 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) 
संबंधित मुद्दे