मेरे पास कुछ मॉडल हैं जो उपयोगकर्ता को विदेशी कुंजी के रूप में रखते हैं। उपयोगकर्ता सूची उपयोगकर्ता नाम प्रदर्शित कर रही है, लेकिन मैं इसे अनुकूलित करना चाहता हूं। क्या मुझे कस्टम मॉडल के साथ उपयोगकर्ता मॉडल का विस्तार करना है और अपना खुद का __str__
फ़ंक्शन लिखना है? क्या कोई आसान तरीका है? मुझे नहीं लगता कि आप फ़ील्डसेट के लिए कॉल करने योग्य का उपयोग कर सकते हैं, है ना?विदेशी कुंजी के रूप में उपयोग किए जाने पर Django Admin में उपयोगकर्ता प्रतिनिधित्व कैसे बदलें?
उत्तर
आप उपयोगकर्ता __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
मान लें तो आप इस
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'
प्रश्न यह पूछ रहा है कि जब उपयोगकर्ता एक विदेशी कुंजी है तो उपयोगकर्ता फ़ील्ड अन्य ऑब्जेक्ट्स को कैसे देखता है। यह केवल UserProfile पृष्ठ पर प्रतिनिधित्व को बदल देगा। – jastr
Django रूपों में ForeignKeys
ModelChoiceFields
का प्रतिनिधित्व कर रहे कुछ कर सकते हैं। 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
यह एक अच्छा समाधान है, लेकिन प्रत्येक मॉडल के लिए एक कस्टम व्यवस्थापक मॉडल को परिभाषित करने की आवश्यकता है। – jastr
मुझे लगता है कि __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)
Django बेस उपयोगकर्ता श्रेणी में वह सजावट है, इसलिए लोड '__unicode__' पर' __str__ 'पर सेट किया गया है। इसलिए, ऐसा लगता है कि हमें '__unicode__' – jastr
को ओवरराइड करने की आवश्यकता होगी असल में '__unicode__' विधि को ओवरराइड करने की आवश्यकता नहीं है, ओवरराइडिंग को रोकने के लिए हम' add_to_class' का उपयोग कर रहे हैं – Surajano
- 1. Django में का उपयोग कैसे करें 'उपयोगकर्ता' विदेशी कुंजी के रूप में 1.5
- 2. Django - फिक्स्चर में विदेशी कुंजी
- 3. Django - उपयोगकर्ता मॉडल के लिए विदेशी कुंजी
- 4. Django: क्वेरी विदेशी कुंजी
- 5. Django Admin
- 6. Django Admin
- 7. विदेशी कुंजी नाम कैसे बदलें?
- 8. Angularjs में Django Admin
- 9. Django, एक मॉडल विदेशी कुंजी में समूह द्वारा फिल्टर उपयोगकर्ता
- 10. उपयोगकर्ता को विदेशी कुंजी में शून्य की अनुमति दें। Django
- 11. Django विदेशी कुंजी प्रश्नों
- 12. django admin
- 13. Django विदेशी कुंजी वस्तुओं
- 14. django विदेशी कुंजी
- 15. Django admin list_display
- 16. Django auth उपयोगकर्ता मॉडल का उपयोग विदेशी और रिवर्स रिलेशनशिप के रूप में
- 17. Django: विदेशी कुंजी
- 18. django-admin इनलाइन रूपों पर हटाए जाने का सत्यापन
- 19. एक बार उपयोग किए जाने के बाद मैं Django में सत्र कुंजी कैसे हटा सकता हूं?
- 20. Django: विशिष्ट विदेशी कुंजी
- 21. विदेशी कुंजी Django मॉडल
- 22. Django Admin
- 23. सीक्वेलिज़, समग्र कुंजी के रूप में विदेशी कुंजी
- 24. django admin
- 25. Django-Admin
- 26. Django - विदेशी कुंजी गुणों पर फ़िल्टरिंग
- 27. विदेशी कुंजी संपत्ति पर Django व्यवस्थापक फ़िल्टर
- 28. विदेशी कुंजी में Django bulk_create वस्तुओं का उपयोग करना?
- 29. Django आत्म-संदर्भित विदेशी कुंजी
- 30. Django व्यवस्थापक: संबंधित विदेशी कुंजी
आप कस्टम उपयोगकर्ता व्यवस्थापक जैसे @dmitryro का उपयोग कर सकते हैं। आपने जो कुछ पूछा है उसे पूरा करने के लिए आपको django-admin-tools की आवश्यकता नहीं होगी। यदि आपको कहीं और उपयोगकर्ता नाम के अलावा कुछ और दिखाने की ज़रूरत है, तो मैं कस्टम उपयोगकर्ता मॉडल बनाने के बजाय प्रॉक्सी मॉडल का उपयोग करने और __str__ विधि को ओवरराइड करने की सलाह दूंगा। – xtranophilist
मैं उपयोगकर्ता के लिए प्रॉक्सी मॉडल बना सकता हूं, लेकिन मुझे लगता है कि मुझे इसे सभी मॉडलों के लिए विदेशी कुंजी के रूप में उपयोग करना चाहिए? – vicusbass
हां, आपको करना होगा। – xtranophilist