2009-03-18 7 views
17

को Django व्यवस्थापक पर्चा मैं 2 टेबल उपयोगकर्ता एक डोमेन के बीच कई रिश्ते के लिए कई की है। मैंने डोमेन संबंध में इस संबंध को परिभाषित किया है। तो व्यवस्थापक इंटरफ़ेस में जब मैं डोमेन देख रहा हूं तो मैं उपयोगकर्ताओं को देखता हूं। लेकिन जब मैं उपयोगकर्ताओं को देख रहा हूं तो मुझे डोमेन दिखाई नहीं देता है। मैं इसे कैसे प्राप्त कर सकता हूं।कई के लिए कई रिश्ते

उत्तर

4

मुझे लगता है कि आप जो खोज रहे हैं वह InlineModelAdmin है।

+0

शायद नहीं क्या ओ पी (संबंध के दोनों ओर से नियमित रूप से ManyToMany फिल्टर का भी उपयोग कर के लिए एक रास्ता) के लिए उम्मीद की थी, लेकिन इस समाधान मैं भी प्रयोग करेंगे है। –

+3

मैं रिलेशनशिप तालिका (मेरे मामले में डोमेन_यूसर) का संदर्भ कैसे लगा सकता हूं मेरे पास स्पष्ट मध्यस्थ तालिका नहीं है। इस मामले में मैं कईToManyRelationship –

8

केवल निर्मित रास्ता एक InlineModelAdmin के माध्यम से है, लेकिन आप इस उद्देश्य के लिए क्षेत्र बनाने के लिए अपने उपयोगकर्ता ModelAdmin के साथ एक कस्टम ModelForm उपयोग कर सकते हैं। सरलीकृत सेटअप के लिए नीचे दिया गया कोड देखें (users = ManyToManyField(related_name='domains') मानता है)।

### yourapp/admin.py ### 

from django import forms 
from django.contrib import admin 
from django.contrib.auth.models import User 
from django.utils.translation import ugettext_lazy as _ 
from django.contrib.admin.widgets import FilteredSelectMultiple 

from .models import Domain 

class DomainAdmin(admin.ModelAdmin): 
    filter_horizonal = ('users',) 

class UserAdminForm(forms.ModelForm): 
    domains = forms.ModelMultipleChoiceField(
     queryset=Domain.objects.all(), 
     required=False, 
     widget=FilteredSelectMultiple(
      verbose_name=_('Domains'), 
      is_stacked=False 
     ) 
    ) 

    class Meta: 
     model = User 

    def __init__(self, *args, **kwargs): 
     super(UserAdminForm, self).__init__(*args, **kwargs) 

     if self.instance: 
      self.fields['domains'].initial = self.instance.domains.all() 

    def save(self, commit=True): 
     user = super(UserAdminForm, self).save(commit=False) 

     user.domains = self.cleaned_data['domains'] 

     if commit: 
      user.save() 
      user.save_m2m() 

     return user 

class UserAdmin(admin.ModelAdmin): 
    form = UserAdminForm 

admin.site.register(Domain, DomainAdmin) 
admin.site.unregister(User) 
admin.site.register(User, UserAdmin) 
+1

के लिए InlineModelAdmin का उपयोग कैसे करूं, यह 'उपयोगकर्ता' जोड़ते समय मेरे लिए काफी काम नहीं करता (मेरे मामले में 'उपयोगकर्ता' नहीं)। मुझे '__init__' विधि में 'self.instance.id' की जांच करने की आवश्यकता थी, और मुझे डोमेन को निर्दिष्ट करने से पहले' नई वस्तु 'को सहेजने की आवश्यकता थी। – alalonde

14

मुझे पता है कि यह एक पुराने धागा है, लेकिन यह पहली नतीजा यह है कि गूगल पर आया था और मैंने सोचा कि एक बेहतर जवाब जरूरी हो गया था।

class Test1(models.Model): 
    tests2 = models.ManyToManyField('Test2', blank=True) 

class Test2(models.Model): 
    tests1 = models.ManyToManyField(Test1, through=Test1.tests2.through, blank=True) 

मैं इसे अपने आप परीक्षण किया है और परिणामों के साथ बहुत खुश था की है:

this django bug report वाया मैं सबसे अच्छा तरीका है अपने ManyToManyField दोनों मॉडलों पर दिखाई है पाया।

+0

मुझे त्रुटि संदेश "test2" परिभाषित नहीं किया गया है जो तर्क लगता है क्योंकि टेस्ट 2 को परिभाषित नहीं किया जाता है। यद्यपि काम करते हुए आपका समाधान शानदार होगा – Timo

0

लोग हैं, जो अभी भी इस टक्कर के लिए, यह जाँच https://github.com/kux/django-admin-extend

यह ModelAdmins कि पहले से ही अन्य एप्लिकेशन द्वारा परिभाषित किया गया है में द्विदिश कई करने वाली कई क्षेत्रों इंजेक्शन लगाने के लिए एक तंत्र प्रदान लायक हो सकता है।

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

  • कोई संबंधित समस्या नहीं^_^