2016-06-28 5 views
9

मेरे पास कुछ मॉडल हैं जो उपयोगकर्ता को विदेशी कुंजी के रूप में रखते हैं। उपयोगकर्ता सूची उपयोगकर्ता नाम प्रदर्शित कर रही है, लेकिन मैं इसे अनुकूलित करना चाहता हूं। क्या मुझे कस्टम मॉडल के साथ उपयोगकर्ता मॉडल का विस्तार करना है और अपना खुद का __str__ फ़ंक्शन लिखना है? क्या कोई आसान तरीका है? मुझे नहीं लगता कि आप फ़ील्डसेट के लिए कॉल करने योग्य का उपयोग कर सकते हैं, है ना?विदेशी कुंजी के रूप में उपयोग किए जाने पर Django Admin में उपयोगकर्ता प्रतिनिधित्व कैसे बदलें?

+1

आप कस्टम उपयोगकर्ता व्यवस्थापक जैसे @dmitryro का उपयोग कर सकते हैं। आपने जो कुछ पूछा है उसे पूरा करने के लिए आपको django-admin-tools की आवश्यकता नहीं होगी। यदि आपको कहीं और उपयोगकर्ता नाम के अलावा कुछ और दिखाने की ज़रूरत है, तो मैं कस्टम उपयोगकर्ता मॉडल बनाने के बजाय प्रॉक्सी मॉडल का उपयोग करने और __str__ विधि को ओवरराइड करने की सलाह दूंगा। – xtranophilist

+1

मैं उपयोगकर्ता के लिए प्रॉक्सी मॉडल बना सकता हूं, लेकिन मुझे लगता है कि मुझे इसे सभी मॉडलों के लिए विदेशी कुंजी के रूप में उपयोग करना चाहिए? – vicusbass

+1

हां, आपको करना होगा। – xtranophilist

उत्तर

3

आप उपयोगकर्ता __unicode__ विधि को ओवरराइड करके Django डिफ़ॉल्ट उपयोगकर्ता के स्ट्रिंग प्रस्तुति को बदल सकते हैं। शायद models.py में अपने अनुप्रयोग में कहीं नीचे कोड जोड़ें,

def custom_user_display(self): 
    return self.email + ', ' self.first_name # write your representation here 

User.add_to_class("__unicode__", custom_user_display) # override the __unicode__ method 
2

मान लें तो आप इस

class UserProfile(models.Model): 
    user = models.OneToOneField(User, unique=True, verbose_name=_('user'), related_name='profile') 
    city = models.CharField(max_length=128, null=True, blank=True) 

की तरह एक मॉडल है और आप व्यवस्थापक में उपयोगकर्ता नाम या उपयोगकर्ता आईडी के बजाय उपयोगकर्ता के ईमेल दिखाना चाहते हैं पेज है, तो आप की तरह इस

class UserProfileAdmin(admin.ModelAdmin): 
    list_display = ('get_user', 'city') 

    def get_user(self, obj): 
     return obj.user.email 
    get_user.short_description = 'User' 
    get_user.admin_order_field = 'user__id' 
+1

प्रश्न यह पूछ रहा है कि जब उपयोगकर्ता एक विदेशी कुंजी है तो उपयोगकर्ता फ़ील्ड अन्य ऑब्जेक्ट्स को कैसे देखता है। यह केवल UserProfile पृष्ठ पर प्रतिनिधित्व को बदल देगा। – jastr

3

Django रूपों में ForeignKeysModelChoiceFields का प्रतिनिधित्व कर रहे कुछ कर सकते हैं। ModelChoiceField कक्षा में label_from_instance विधि है, जो निर्णय लेती है कि विकल्प कैसे प्रस्तुत किया जाए। इसलिए व्यवस्थापक में इस प्रस्तुति को बदलने के लिए, आपको इस फॉर्म फ़ील्ड को संशोधित करने की आवश्यकता है।

यहां एक साधारण उदाहरण है।

class MyModelAdmin(admin.ModelAdmin): 
    def formfield_for_foreignkey(self, db_field, request, **kwargs): 
     field = super(MyModelAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs) 
     if db_field.name == "user": 
      field.label_from_instance = lambda u: "My Object #%i" % u.id 
     return field 
+1

यह एक अच्छा समाधान है, लेकिन प्रत्येक मॉडल के लिए एक कस्टम व्यवस्थापक मॉडल को परिभाषित करने की आवश्यकता है। – jastr

9

मुझे लगता है कि __unicode__() विधि सही नहीं है, तो आप __str__() विधि का उपयोग करना चाहिए।

Python 2.x के लिए, __str__() विधि str (बाइट) और __unicode__() विधि लौट यूनिकोड (पाठ) वापस आ जाएगी होगा।

प्रिंट बयान और str में निर्मित कॉल __str__() एक वस्तु का मानव पठनीय प्रतिनिधित्व निर्धारित करने के लिए। पर निर्मित यूनिकोड __unicode__() कॉल करता है यदि यह मौजूद है, और अन्यथा __str__() पर वापस आ जाता है और सिस्टम एन्कोडिंग के साथ परिणाम को डीकोड करता है। इसके विपरीत, मॉडल बेस क्लास स्वचालित रूप से __str__() __unicode__() से यूटीएफ -8 को एन्कोडिंग करके प्राप्त करता है। read here complete

लेकिन Python 3.x में सिर्फ __str__(), कोई __unicode__() तरीका है।

Django __str__() और __unicode__() तरीकों कि अजगर 2 और 3 पर काम परिभाषित करने के लिए एक आसान तरीका प्रदान करता है: आप एक __str__() विधि लौटने पाठ को परिभाषित करना होगा और python_2_unicode_compatible() डेकोरेटर लागू करने के लिए।

पायथन 3 पर, सजावटी एक नो-ऑप है। पायथन 2 पर, यह उचित __unicode__() और __str__() विधियों को परिभाषित करता है (प्रक्रिया में मूल __str__() विधि को प्रतिस्थापित करता है)।

यहां django दस्तावेज़ों का एक उदाहरण है।

from django.utils.encoding import python_2_unicode_compatible 

@python_2_unicode_compatible 
class MyClass(object): 
    def __str__(self): 
     return "Instance of my class" 

समाधान: एक ही तरह से डेकोरेट, के रूप में models.py में अपनी क्लास और के लिए ऊपर किया है, एक तरीका है जिसके उपयोगकर्ता मॉडल में जोड़ दी हो जाएगा जोड़ें।

from django.contrib.auth.models import User 

def get_name(self): 
    return '{} {}'.format(self.first_name, self.last_name) 

User.add_to_class("__str__", get_name) 
+1

Django बेस उपयोगकर्ता श्रेणी में वह सजावट है, इसलिए लोड '__unicode__' पर' __str__ 'पर सेट किया गया है। इसलिए, ऐसा लगता है कि हमें '__unicode__' – jastr

+0

को ओवरराइड करने की आवश्यकता होगी असल में '__unicode__' विधि को ओवरराइड करने की आवश्यकता नहीं है, ओवरराइडिंग को रोकने के लिए हम' add_to_class' का उपयोग कर रहे हैं – Surajano

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