2009-03-18 28 views
17

2 tablo Kullanıcılar arasında bir çok ilişki var bir Etki Alanları. Bu ilişkiyi Domains sınıfında tanımladım. Yani yönetici arayüzünde, Etki Alanları'nı görüntülerken Kullanıcıları görüyorum. Ancak, Kullanıcıları görüntülerken Alanlar'ı görmüyorum. Bunu nasıl başarabilirim.Django Yönetici Formu Birçok farklı ilişki için

cevap

4

Aradığınız şeyin InlineModelAdmin olduğunu düşünüyorum.

+0

Muhtemelen OP'nin ne beklediğini (normal ManyToMany filtre seçicisini ilişkinin her iki tarafından kullanmanın bir yolu) değil, ama bu benim de kullanacağım çözüm. –

+3

İlişki tablosuna nasıl başvurabilirim (durumumdaki Domains_User) Açık ara tablo yok. Bu durumda, ManyToManyRelationship –

8

Yalnızca yerleşik bir yol, bir InlineModelAdmin yoluyla yapılır, ancak bu amaçla alan oluşturmak için User ModelAdmin'inizle özel bir ModelForm kullanabilirsiniz. Basitleştirilmiş kurulum için aşağıdaki kodlara bakın (users = ManyToManyField(related_name='domains') varsayar).

### 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

için InlineModelAdmin'i nasıl kullanırım? Bu, 'kullanıcı' eklerken benim için işe yaramadı (benim durumumda 'Kullanıcı' değil). '__init__' yönteminde self.instance.id' i kontrol etmem gerekiyordu ve yeni nesneyi etki alanına atamadan önce kaydetmem gerekiyordu. – alalonde

14

Bu eski bir iplik olduğunu biliyorum, ama bu google gelen ilk sonucuydu ve daha iyi bir cevap gerekli olduğunu düşündüm.

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

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

kendim test edilmiş ve sonuçları ile çok memnun oldu:

this django bug report Via senin ManyToManyField her iki modelde de gösterilmesi için en iyi yol buldu. Hala bu karşılaşırız insanlar için

+0

"Test2" hata tanımlı değil, mantık gibi görünüyor, çünkü Test2, çağrıldığında tanımlanmadı. Yine de çözümünüz işe yarayacaktır. – Timo

0

, bu Zaten diğer uygulamalar tarafından tanımlanmış ModelAdmins içinde çift yönlü çok-çok alanı enjekte edilmesi için bir mekanizma sağlar https://github.com/kux/django-admin-extend

incelemeye değer olabilir.