it-swarm.dev

Özel bir kullanıcı modeli için Django auth UserAdmin kullanma

Django.Contrib.Auth docs'tan :

Django’nun varsayılan Kullanıcısı. Django’nun Kullanıcı modelinden tamamen memnunsanız ve yalnızca bazı ek bilgiler eklemek istiyorsanız, Django.contrib.auth.models.AbstractUser alt sınıfına girebilir ve özel profil alanlarınızı ekleyebilirsiniz. Bu sınıf, varsayılan Kullanıcının tam bir uygulamasını soyut bir model olarak sunar.

Söylendi ve yapıldı. Aşağıdakine benzer yeni bir model yarattım:

class MyUser(AbstractUser):
  some_extra_data = models.CharField(max_length=100, blank=True)

Bu, yönetici olarak neredeyse Django'nun standart User'ını gösterir. Bununla birlikte, admin'deki en önemli fark, parola (yeniden) ayarlanan alanın mevcut olmaması, ancak bunun yerine normal bir CharField gösterilmesidir. Bunun işe yaraması için admin-config içerisindeki maddeleri geçersiz kılmam gerekiyor mu? Öyleyse, bunu biraz DRY şekilde nasıl yapabilirim (yani Django kaynağından şeyler kopyalamadan ... eww ...)?

65
nip3o

Django kaynak kodunu bir süre kazıdıktan sonra, çalışan bir ruh buldum. Bu çözümden tamamen memnun değilim ama işe yarıyor. Daha iyi çözümler önermek için çekinmeyin!


Django, Nice admin'in UserAdmin modelini aramasını sağlamak için User öğesini kullanır. Bunu sadece admin.py- dosyamızda kullanarak modelimiz için aynı bakışı bulabiliriz.

from Django.contrib.auth.admin import UserAdmin
admin.site.register(MyUser, UserAdmin)

Ancak, bu tek başına muhtemelen iyi bir çözüm değildir, çünkü Django Admin özel alanlarınızı göstermez. Bunun iki nedeni var:

  • UserAdmin, nesnesini değiştirirken kullanılacak form olarak UserChangeForm işlevini kullanır, ki bu da model olarak User öğesini kullanır.
  • UserAdmin, daha sonra formsets tarafından kullanılan, özel alanlarınızı içermeyen bir UserChangeForm- özelliğini tanımlar.

Böylece, Meta iç sınıfını aşırı yükleyen, değişim formunun doğru modeli kullandığı özel bir değişim formu oluşturdum. Ayrıca, özel tarlalarımı tarla setine eklemek için UserAdmin 'a aşırı yükleme yapmak zorunda kaldım. İyileştirmeler önermek için çekinmeyin!

from Django.contrib.auth.admin import UserAdmin
from Django.contrib.auth.forms import UserChangeForm

class MyUserChangeForm(UserChangeForm):
    class Meta(UserChangeForm.Meta):
        model = MyUser

class MyUserAdmin(UserAdmin):
    form = MyUserChangeForm

    fieldsets = UserAdmin.fieldsets + (
            (None, {'fields': ('some_extra_data',)}),
    )


admin.site.register(MyUser, MyUserAdmin)
103
nip3o

nico'ın cevabı çok yardımcı oldu ama yeni bir kullanıcı oluştururken Django'nun hala Kullanıcı modeline referans verdiğini gördüm.

Bilet # 19353 bu soruna atıfta bulunuyor.

Bunu düzeltmek için admin.py 'a birkaç tane daha eklemem gerekti.

admin.py:

from Django.contrib import admin
from Django.contrib.auth.admin import UserAdmin
from Django.contrib.auth.forms import UserChangeForm, UserCreationForm
from main.models import MyUser
from Django import forms


class MyUserChangeForm(UserChangeForm):
    class Meta(UserChangeForm.Meta):
        model = MyUser


class MyUserCreationForm(UserCreationForm):
    class Meta(UserCreationForm.Meta):
        model = MyUser

    def clean_username(self):
        username = self.cleaned_data['username']
        try:
            MyUser.objects.get(username=username)
        except MyUser.DoesNotExist:
            return username
        raise forms.ValidationError(self.error_messages['duplicate_username'])


class MyUserAdmin(UserAdmin):
    form = MyUserChangeForm
    add_form = MyUserCreationForm
    fieldsets = UserAdmin.fieldsets + (
        (None, {'fields': ('extra_field1', 'extra_field2',)}),
    )

admin.site.register(MyUser, MyUserAdmin)
50
kdh454

Daha basit bir çözüm, admin.py:

from Django.contrib.auth.admin import UserAdmin
from main.models import MyUser

class MyUserAdmin(UserAdmin):
    model = MyUser

    fieldsets = UserAdmin.fieldsets + (
            (None, {'fields': ('some_extra_data',)}),
    )

admin.site.register(MyUser, MyUserAdmin)

Django, oluşturma ve değiştirme için MyUser modeline doğru bir şekilde başvuruda bulunacaktır .. __ Django 1.6.2 kullanıyorum.

38
cesc

yaratma formuna özel bir alan eklemeye çalıştığımda cesc'in cevabı benim için işe yaramadı. Belki de 1.6.2'den beri değişti? Her iki durumda da, alanı hem alan kümelerine eklerken buldum hem de add_fieldsets bunu yaptı. 

ADDITIONAL_USER_FIELDS = (
    (None, {'fields': ('some_additional_field',)}),
)

class MyUserAdmin(UserAdmin):
    model = MyUser

    add_fieldsets = UserAdmin.add_fieldsets + ADDITIONAL_USER_FIELDS
    fieldsets = UserAdmin.fieldsets + ADDITIONAL_USER_FIELDS

admin.site.register(MyUser, MyUserAdmin)
3
aidnani8

Başka bir benzer çözüm ( Buradan alındı ​​ ):

from __future__ import unicode_literals

from Django.contrib import admin
from Django.contrib.auth.admin import UserAdmin
from Django.contrib.auth.models import AbstractUser
from Django.utils.translation import ugettext_lazy as _

from .models import User


class UserAdminWithExtraFields(UserAdmin):

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

        abstract_fields = [field.name for field in AbstractUser._meta.fields]
        user_fields = [field.name for field in self.model._meta.fields]

        self.fieldsets += (
            (_('Extra fields'), {
                'fields': [
                    f for f in user_fields if (
                        f not in abstract_fields and
                        f != self.model._meta.pk.name
                    )
                ],
            }),
        )


admin.site.register(User, UserAdminWithExtraFields)
0