2009-05-28 25 views
12

django.contrib.auth'da yerleşik kullanıcı modeline ForeignKey içeren bir modelim var ve yöneticinin seçim kutusunun her zaman kullanıcının birincil anahtarı tarafından sıralandığından rahatsızlık duyuyorum.Kullanıcıları django auth içinde yeniden sırala

Kullanıcı adını alfabetik olarak sıralamayı tercih etmekteyim ve içgüdüsel olarak Django'nun gizemleri ile uğraşmak istemem, kullanıcıları yeniden sıralamak için daha basit bir yol bulamıyorum. Aklıma

en basit yolu yüklemek benim Django içine daldırın ve kullanıcı modeli Meta sınıfına

ordering = ('username',) 

eklemek olacaktır.

Kullanıcı modelinin siparişini değiştirmek için yapabileceğim bir çeşit maymun işi veya daha az invaziv bir yol var mı?

Alternatif olarak, bu değişikliği yaparak kırılabilecek her şey olabilir mi?

cevap

23

Kendi formunuzu belirtmek için ModelAdmin objects'u kullanmanın bir yolu vardır. Kendi formunuzu belirterek, formun kompozisyonu ve doğrulaması üzerinde tam kontrol sahibi olursunuz.

Bir FK'ye User olan modelin Foo olduğunu varsayalım. Bunu yaptıktan sonra

from django.contrib.auth.models import User 
from django import forms 
from django.contrib import admin 

class FooAdminForm(forms.ModelForm): 
    user = forms.ModelChoiceField(queryset=User.objects.order_by('username')) 

    class Meta: 
     model = Foo 

class FooAdmin(admin.ModelAdmin): 
    form = FooAdminForm 

admin.site.register(Foo, FooAdmin) 

, <select> açılan sipariş edecek:

from django.db import models 
from django.contrib.auth.models import User 

class Foo(models.Model): 
    user = models.ForeignKey(User) 
    some_val = models.IntegerField() 

Daha sonra böyle bir myapp/admin.py dosya içeren bir şey yaratmak olacaktır:

Sizin myapp/models.py aşağıdaki gibi görünebilir kullanıcı adlarına göre kullanıcı nesneleri. Foo'daki diğer alanlara endişelenmenize gerek yok ... sadece FooAdminForm sınıfınızdaki geçersiz kılmaları belirtmeniz yeterli. Ne yazık ki, yönetici sitesinde sunmak istediğiniz Kullanıcıya FK olan her model için bu özel form tanımını sağlamanız gerekir. Yukarıdaki

+0

bu benim için harika çalıştı – Rasiel

+0

Sipariş harika çalışıyor, ancak şimdi bu alanlar gerektiği gibi geliyor. Onları nasıl isteğe bağlı tutarım? – thumbtackthief

14

Jarret cevabı aslında şöyle olmalıdır: form içeren modül içe aktarıldığında, bir kez yerine

from django.contrib.auth.models import User 
from django.contrib import admin 
from django import forms 
from yourapp.models import Foo 

class FooAdminForm(forms.ModelForm): 
    class Meta: 
     model = Foo 

    def __init__(self, *args, **kwds): 
     super(FooAdminForm, self).__init__(*args, **kwds) 
     self.fields['user'].queryset = User.objects.order_by(...) 

class FooAdmin(admin.ModelAdmin): 
    # other stuff here 
    form = FooAdminForm 

admin.site.register(Foo, FooAdmin) 

böylece QuerySet, form oluştururken her zaman yeniden değerlendirilir alır.

+2

Bu, yalnızca Kullanıcı alanının ötesinde gereken tüm alanları otomatik olarak oluşturacak çok daha iyi bir yanıt gibi görünüyor. –

İlgili konular