2015-09-14 12 views
17

मैं निम्नलिखित मॉडल:अप्रत्यक्ष इनलाइन

class UserProfile(models.Model): 
    user = models.OneToOneField(User) 

class Property(models.Model): 
    user = models.ForeignKey(User) 

मैं एक TabularInline अपने Django व्यवस्थापक पृष्ठ पर एक विशेष UserProfile से जुड़ा हर संपत्ति को प्रदर्शित बनाना चाहेंगे। समस्या यह है कि संपत्ति एक ForeignKey सीधे UserProfile की जरूरत नहीं है, तो मैं बस

class PropertyTabularInline(admin.TabularInline): 
    model = Property 

class UserProfileAdmin(admin.ModelAdmin): 
    inlines = (PropertyTabularInline,) 

कैसे मैं आसानी से जो मैं चाहता क्या कर सकते हैं नहीं लिख सकते हैं, ज़ाहिर है, है?

उत्तर

1

आप Profile और Property दोनों मॉडलों को प्रदर्शित करने के लिए उपयोगकर्ता व्यवस्थापक पृष्ठ को ओवरराइट कर सकते हैं।

from django.contrib import admin 
from django.contrib.auth.admin import UserAdmin 
from myapp.models import * 

class ProfileInline(admin.TabularInline): 
    model = Profile 

class PropertyInline(admin.TabularInline): 
    model = Property 

class UserAdmin(UserAdmin): 
    inlines = (ProfileInline, PropertyInline,) 

admin.site.unregister(User) 
admin.site.register(User, UserAdmin) 

तुम भी प्रदर्शित किया जा रहा है (जैसे समूह या अनुमतियां) से किसी भी अवांछित/अप्रयुक्त उपभोक्ता के गुण को हटा सकते हैं

अधिक यहाँ: https://docs.djangoproject.com/en/1.8/topics/auth/customizing/#extending-the-existing-user-model

और यहाँ: https://docs.djangoproject.com/en/1.8/topics/auth/customizing/#a-full-example

+1

यह वही नहीं है जो मैं चाहता हूं, हालांकि - मैं प्रोफ़ाइल व्यवस्थापक पृष्ठ पर इनलाइन प्रदर्शित करना चाहता हूं, न कि उपयोगकर्ता व्यवस्थापक पृष्ठ पर। – haroba

0

यह प्राप्त है अपने मॉडल में एक बदलाव करके।

इसके बजाय UserProfile से User को OneToOne संबंध बनाने, उपवर्ग User UserProfile बनाने की

। कोड है कि तरह दिखना चाहिए:

class UserProfile(User): 
    # some other fields, no relation to User model 

class Property(models.Model): 
    user = models.ForeignKey(User) 

कि UserProfile मॉडल है कि User मॉडल के लिए OneToOne संबंध छिपा हुआ है बनाने में परिणाम होगा, यह उपयोगकर्ता मॉडल नकल नहीं होंगे।

उस परिवर्तन के बाद, आपका कोड काम करेगा। हुड के तहत कुछ बदलाव हैं, जैसे कि UserProfile में अब इसकी आईडी नहीं है, आप User से UserProfile के अंदर फ़ील्ड तक पहुंच सकते हैं और का उपयोग कर User मॉडल को स्वैप करना मुश्किल है (जिसके लिए उचित प्रकार लौटने और हाथ से माइग्रेशन बदलने के लिए कुछ कस्टम फ़ंक्शन बनाने की आवश्यकता होगी) लेकिन अगर यह आपके लिए कोई समस्या नहीं है, तो यह अच्छा समाधान हो सकता है।

+0

यह एक विकल्प नहीं है। यहां बिंदु यह है कि मैं नहीं चाहता हूं कि उपयोगकर्ता से फ़ील्ड उपयोगकर्ता प्रोफाइल पर पहुंच योग्य हो क्योंकि मेरे पास कई उपयोगकर्ता प्रोफाइल-जैसे मॉडल हैं जो उपयोगकर्ता के साथ OneToOne संबंधों के साथ हैं जिनके पास विभिन्न एक्सेस नियंत्रण आदि हैं। – haroba

1
class PropertyTabularInline(admin.TabularInline): 
    model = Property 

    def formfield_for_dbfield(self, field, **kwargs): 
     if field.name == 'user': 
      # implement your method to get userprofile object from request here. 
      user_profile = self.get_object(kwargs['request'], UserProfile) 
      kwargs["queryset"] = Property.objects.filter(user=user_profile) 
     return super(PropertyInLine, self).formfield_for_dbfield(field, **kwargs) 

एक बार यह हो जाए, आप जोड़ सकते हैं उपयोगकर्ता को यह इनलाइन चाहते UserProfileAdmin:

class UserProfileAdmin(admin.ModelAdmin): 
    inlines = (PropertyTabularInline,) 

यह परीक्षण नहीं किया है, लेकिन वह काम करना चाहिए।

+0

यह django 1.8 के लिए काम नहीं करेगा और शायद 1.7 भी, यह सिस्टम जांच पर असफल हो जाएगा: ': (admin.E202) 'app.Property' में 'app.UserProfile' के लिए कोई विदेशीकी नहीं है। – GwynBleidD

+0

@GwynBleidD: में काम करना django1.8 मेरे ऐप में –

+0

सिस्टम ऑपरेशन करने वाले सभी ऑपरेशन विफल हो जाएंगे, उदाहरण के लिए नए माइग्रेशन बनाना। – GwynBleidD

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