2010-05-11 9 views
5

मेरे पास विदेशी कीफिल्ड और कई टोमनीफिल्ड दोनों पर raw_id का उपयोग करके एक ऐप है। व्यवस्थापक संपादन बॉक्स के दाईं ओर विदेशी कुंजी का मान प्रदर्शित करता है।Django व्यवस्थापक में कई से अधिक संबंधों के raw_id मान को कैसे दिखाया जाए?

दुर्भाग्यवश, यह ManyToMany के साथ काम नहीं करता है। मैंने कोड की जांच की है और मुझे लगता है कि यह सामान्य व्यवहार है। हालांकि मैं जानना चाहूंगा कि इस व्यवहार को बदलने के लिए किसी के पास एक आसान युक्ति है या नहीं?

अग्रिम धन्यवाद

अद्यतन: मैं ManyToManyRawIdWidget उपवर्ग करने की कोशिश की है, लेकिन मैं कैसे कहना है कि raw_id_fields अपने कस्टम विजेट का उपयोग करना चाहिए पता नहीं है। formfield_overrides raw_id फ़ील्ड

उत्तर

8

के साथ काम नहीं कर रहा है अंततः मैं इसे काम करने में सफल रहा हूं।

from django.contrib.admin.widgets import ManyToManyRawIdWidget 

class VerboseManyToManyRawIdWidget(ManyToManyRawIdWidget): 
    def __init__(self, rel, attrs=None): 
     super(VerboseManyToManyRawIdWidget, self).__init__(rel, attrs) 

    def label_for_value(self, value): 
     values = value.split(',') 
     str_values = [] 
     key = self.rel.get_related_field().name 
     for v in values: 
      try: 
       obj = self.rel.to._default_manager.using(self.db).get(**{key: v}) 
       str_values += [escape(u'%s' % obj)] 
      except self.rel.to.DoesNotExist: 
       str_values += [u'???'] 
     return u'&nbsp;<strong>%s</strong>' % (u',&nbsp;'.join(str_values)) 


class MyAdmin(admin.ModelAdmin): 
    def formfield_for_dbfield(self, db_field, **kwargs): 
     if db_field.name in ('foo', 'bar'): 
      try: 
       del kwargs['request'] 
      except KeyError: 
       pass 
      kwargs['widget'] = VerboseManyToManyRawIdWidget(db_field.rel) 
      return db_field.formfield(**kwargs) 
     return super(MyAdmin,self).formfield_for_dbfield(db_field,**kwargs) 

दुर्भाग्य से, मैं कुछ भी नहीं ;-)

अद्यतन के लिए एक इनाम खर्च कर दिया है: मैं इस के लिए एक Django टुकड़ा बना लिया है: http://djangosnippets.org/snippets/2108/

0

यह Django 1.11 के लिए

from django.contrib.admin.sites import site 
from django.contrib.admin.widgets import ManyToManyRawIdWidget 
from django.core.urlresolvers import reverse, NoReverseMatch 
from django.utils.safestring import mark_safe 


class VerboseManyToManyRawIdWidget(ManyToManyRawIdWidget): 

    def label_and_url_for_value(self, value): 
     result = [] 
     for v in value: 
      key = self.rel.get_related_field().name 
      try: 
       obj = self.rel.model._default_manager.using(self.db).get(**{key: v}) 
      except (ValueError, self.rel.model.DoesNotExist): 
       return '', '' 

      try: 
       url = reverse(
        '{}:{}_{}_change'.format(self.admin_site.name, obj._meta.app_label, 
              obj._meta.object_name.lower()), 
        args=(obj.pk,)) 
      except NoReverseMatch: 
       url = '' # Admin not registered for target model. 

      result.append('<strong><a href="{}">{}</a></strong>'.format(url, str(obj))) 

     return mark_safe('; '.join(result)), '' 


class VerboseRawIdManyToManyAdminMixin: 
    def formfield_for_dbfield(self, db_field, **kwargs): 
     if db_field.name in self.raw_id_fields: 
      kwargs.pop('request', None) 
      if db_field.rel.__class__.__name__ == 'ManyToManyRel': 
       kwargs['widget'] = VerboseManyToManyRawIdWidget(db_field.rel, site) 
      return db_field.formfield(**kwargs) 
     return super().formfield_for_dbfield(db_field, **kwargs) 
काम करता है

इसके अलावा उस उद्देश्य के लिए Django ऐप भी हैdjango-salmonella

संबंधित मुद्दे