2015-09-14 28 views
17

:Dolaylı satır içi Aşağıdaki modelleri var

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

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

Ben onun Django yönetici sayfasında UserProfile belirli bağlı her Mülkiyet gösteren TabularInline oluşturmak istiyorum. Burada sorun Mülkiyet UserProfile doğrudan ForeignKey yok, bu yüzden sadece

class PropertyTabularInline(admin.TabularInline): 
    model = Property 

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

nasıl kolayca istediğimi yapabilirim yazamıyor, elbette, nedir?

cevap

1

Profile ve Property modellerini görüntülemek için Kullanıcı yönetici sayfasının üzerine yazabilirsiniz.

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) 
Ayrıca (örn Gruplar veya İzinler) görüntülenmesini istenmeyen/kullanılmamış Kullanıcı özelliklerini kaldırabilir

burada

daha: Burada https://docs.djangoproject.com/en/1.8/topics/auth/customizing/#extending-the-existing-user-model

ve: https://docs.djangoproject.com/en/1.8/topics/auth/customizing/#a-full-example

+1

İstediğim bu değil, Kullanıcı satırı sayfasındaki Profil yöneticisi sayfasında satır içi görüntülemek istiyorum. – haroba

0

Bu başarılabilir Modellerinizde bir değişiklik yaparak. Bunun yerine UserProfile oluşturma UserProfile den User için alt sınıfı User OneToOne ilişki oluşturma

. Kod bu gibi görünmelidir: User modeline OneToOne ilişkisini gizlediğiniz UserProfile modeli oluştururken neden olacaktır

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

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

, kullanıcı modeli yinelenmesine neden olmaz.

Bu değişikliği yaptıktan sonra kodunuz çalışır. Orada UserProfile gibi kaputun altında bazı değişiklikler vardır artık, sen UserProfile içindeki User alanları kendi kimliğini erişebilir numarasını bulmuş ve onu settings.AUTH_USER_MODEL kullanılarak User modeli takas zor (bazı özel bir işlevi düzgün türü döndüren ve elle göç değişen oluşturmak gerekecektir) ama bu sizin için bir sorun değilse, iyi bir çözüm olabilir.

+0

Bu bir alternatif değil. Buradaki nokta şudur: * Kullanıcıların farklı erişim kontrollerine sahip Kullanıcı ile OneToOne ilişkilerine sahip birkaç UserProfile benzeri modele sahip olduğu için UserProfile'da Kullanıcıların erişebileceği alanları istiyorum. – 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) 

Bu yapıldıktan sonra, kullanıcıya bu satır içi gibi UserProfileAdmin ekleyebilirsiniz:

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

test etmemiş mı, ama bu çalışması gerekir.

+0

Bu, django 1.8 ve belki de 1.7, sistem kontrolünde başarısız olur: ': (admin.E202) 'app.Property' 'app.UserProfile' 'için hiçbir ForeignKey yoktur. – GwynBleidD

+0

@GwynBleidD: Uygulamamda django1.8 –

+0

Sistem kontrolü yapan tüm işlemler, örneğin yeni geçişler oluşturmak için başarısız olur. – GwynBleidD