2011-06-13 8 views
6

मैं इन मॉडल:व्यवस्थापक में सामग्री प्रकार का उपयोग करके मैं मॉडल के प्रदर्शन को कैसे अनुकूलित कर सकता हूं?

class App(models.Model): 
    name = models.CharField(max_length=100) 

class ProjectA(models.Model): 
    name = models.CharField(max_length=100) 
    app = models.ForeignKey(App) 

class ProjectB(ProjectA): 
    pass 

class Attachment(models.Model): 
    content_type = models.ForeignKey(ContentType) 
    object_id  = models.PositiveIntegerField() 
    project   = generic.GenericForeignKey("content_type","object_id") 
    file   = models.FileField(upload_to=".") 

मैं व्यवस्थापक के लिए सभी मॉडलों के पंजीकरण के कर रहा हूँ, और मैं पंजीकरण रद्द कर रहा हूँ समूह, उपयोगकर्ता और साइट। बात है, जब मैं व्यवस्थापक में अनुलग्नक का उपयोग, मैं देख रहा हूँ इसे इस तरह गाया:

select

:

admin for attachment

सामग्री प्रकार चुनें में, मैं यह सूची देखें कारण अटैचमेंट में जेनेरिक फॉरवर्ड है क्योंकि प्रोजेक्ट ए और प्रोजेक्टबी को इसे एक्सेस करने की आवश्यकता है। मुझे पता है कि प्रोजेक्टए और प्रोजेक्टबी समान हैं, लेकिन यह एक आवश्यकता है कि वे 2 अलग-अलग तालिकाओं में संग्रहित हों। मैं व्यवस्थापक से अटैचमेंट क्लास का उपयोग कैसे कर सकता हूं? मुझे पता है कि सामान्य विचारों से सामग्री प्रकार का उपयोग कैसे करें, लेकिन व्यवस्थापक से नहीं।

अटैचमेंट क्लास में मैं केवल प्रोजेक्ट ए या प्रोजेक्ट बी के लिए चयन करना चाहता हूं, और उसके बाद सभी प्रोजेक्ट ए या सभी प्रोजेक्ट बी की एक सूची, जिसके बाद मैं संलग्न करना चाहता हूं।

क्या व्यवस्थापक से ऐसी कोई चीज़ संभव है? क्या मुझे उपयोगकर्ता को ऑब्जेक्ट आईडी कॉलम दिखाना होगा?

उत्तर

8

अगर मैं गलत नहीं हूँ , आप यह चाहते हैं। http://code.google.com/p/django-genericadmin/

मेरी सलाह अलग-अलग काम करेगी। आप ProjectA, ProjectB में इनलाइन के रूप में थोड़ा और फॉर्म जोड़ देंगे। अपने admin.py में

from django.contrib import admin 
from django.contrib.contenttypes import generic 

from myproject.myapp.models import Attachment, ProjectA, ProjectB 

class Attachmentline(generic.GenericTabularInline): #or generic.GenericStackedInline, this has different visual layout. 
    model = Attachment 

class ProjectAdmin(admin.ModelAdmin): 
    inlines = [ 
     Attachmentline, 
    ] 

admin.site.register(ProjectA, ProjectAdmin) 
admin.site.register(ProjectB, ProjectAdmin) 

अपने PROJECTA या ProjectB व्यवस्थापक जाने के लिए और नए व्यवस्थापक को देखते हैं।

यह वही नहीं है जो आप चाहते हैं लेकिन यह आपकी मदद कर सकता है। अन्यथा आपको पहले लिंक की जांच की आवश्यकता है।

+0

सुंदर विकल्प। धन्यवाद! – Geo

+0

मुझे नहीं पता था कि 'जेनेरिक। जेनेरिक टबुलरइनलाइन' थी – Ajoy

1

आपने ध्यान दिया जाना चाहिए कि

"जानते हैं कि PROJECTA और ProjectB समान हैं, लेकिन यह एक आवश्यकता है कि वे 2 अलग तालिकाओं में संग्रहीत कर रहे हैं"

वास्तव में सही नहीं है। सभी डेटा आपके app_projecta तालिका में संग्रहीत हैं, और (केवल) कुछ पॉइंटर्स table app_projectb में रखे जाते हैं। आप पहले से ही इस मार्ग में जा रहे हैं, मैं इस के बजाय के साथ शुरू सुझाव है:

class App(models.Model): 
    name = models.CharField(max_length=100) 

class Project(models.Model): 
    name = models.CharField(max_length=100) 
    app = models.ForeignKey(App) 

class ProjectA(Project): 
    pass 

class ProjectB(Project): 
    pass 

class Attachment(models.Model): 
    project = models.ForeignKey(Project) 
    file   = models.FileField(upload_to=".") 

यह पहले से ही आप थोड़ा जहां प्राप्त करना चाहते हैं के करीब हो जाता है ...

+0

धन्यवाद। GenericForeignKey के लिए विकल्प फ़ील्ड के बारे में क्या? क्या आपको इसके लिए समाधान पता चल जाएगा? – Geo

+0

यूडीआई द्वारा प्रस्तुत विधि को सामान्य विदेशी कुंजी के उपयोग की आवश्यकता नहीं है। आप केवल सादे पुराने विदेशी कुंजी का उपयोग कर प्रोजेक्ट मॉडल का संदर्भ देते हैं। हालांकि, एक दोष यह है कि एक परियोजना दोनों एक परियोजना ए और एक परियोजना बी, या न तो हो सकता है। यदि आप प्रोजेक्टए को प्रोजेक्टबी में कनवर्ट करने की संभावना देते हैं, तो आपको थोड़ी देर में डेटाबेस स्थिरता की जांच करनी होगी। – sleblanc

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

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