2012-11-26 18 views
18

मैं dev doc में वर्णित django उपयोगकर्ता मॉडल का विस्तार करता हूं। मैं मूल उपयोगकर्ता मॉडल सुविधाओं में से अधिकांश को नहीं रखना चाहता, इसलिए मैं सार तत्व श्रेणी का विस्तार करता हूं। मैं settings.py में परिभाषित किया है:Django 1.5 कस्टम उपयोगकर्ता मॉडल त्रुटि। "प्रबंधक उपलब्ध नहीं है; उपयोगकर्ता को बदल दिया गया है"

AUTH_USER_MODEL = 'myapp.CustomUser' 

मेरे उपयोगकर्ता वर्ग:

class CustomUser(AbstractUser): 
    custom_field = models.ForeignKey('OtherModel') 
    objects = UserManager() 

सब कुछ ठीक काम करने के लिए लगता है, लेकिन जब मैं बनाने की कोशिश यह व्यवस्थापक साइट द्वारा प्रबंधित:

admin.site.register(CustomUser, UserAdmin) 

मुझे यह व्यवस्थापक AdminUser निर्माण पृष्ठ (पासवर्ड पुष्टिकरण फ़ॉर्म के सत्यापन के बाद) पर यह त्रुटि प्राप्त होती है:

AttributeError: Manager isn't available; User has been swapped for 'myapp.CustomUser' 

बिंदु यह है कि मुझे मूल उपयोगकर्ता मॉडल (पासवर्ड सत्यापन के साथ दो चरण प्रक्रिया) के साथ समान निर्माण प्रक्रिया के लिए व्यवस्थापक साइट द्वारा प्रबंधित इस मॉडल की आवश्यकता है।

+0

@ thecore की पहली पंक्ति के सही ढंग से समस्या (http://stackoverflow.com/a/13641427/11698) ठीक करता है। हो सकता है कि आप इसे "उत्तर" के रूप में चिह्नित कर सकें - मुझे समय बचाएगा! ;) –

उत्तर

0

Django docs से:

आप भी अपने उपयोगकर्ता मॉडल के लिए एक कस्टम प्रबंधक परिभाषित करना चाहिए।

+0

असल में मैंने UserManager को बढ़ाया, लेकिन मुझे एक ही परिणाम मिल गया। मैंने अपना प्रश्न कम करने के लिए इसे नहीं दिखाया। – bpetit

+0

आपको शायद बेसयूसर प्रबंधक का विस्तार करना चाहिए। – Bula

+0

यदि मैं BaseUserManager का विस्तार करता हूं तो मुझे उपयोगकर्ता निर्माण के लिए व्यवस्थापक साइट का उपयोग करना चाहते हैं, तो मुझे अधिकांश सार उपयोगकर्ता फ़ील्ड और विधियों को ओवरराइड करना होगा। मैं सारस्ट्रूसर का उपयोग करना पसंद करूंगा, जब तक कि यह django dev doc में उल्लेख किया गया हो। – bpetit

0

उपवर्ग AbstractUser पहले से ही (लाइन 327 पर this code on github) आप के लिए objects = UserManager() संभाल। आपको इसे फिर से अपने मॉडल में परिभाषित करने की आवश्यकता नहीं है।

मुझे यकीन नहीं है कि यह त्रुटि के साथ क्यों आती है। लेकिन नीचे विन्यास नवीनतम देव संस्करण के साथ मेरे लिए काम लगता है।

Model.py:

class CustomUser(AbstractUser): 
    custom_field = models.ForeignKey('OtherModel') 
    # remove : objects = UserManager() 
+0

उत्तर के लिए धन्यवाद। परिणाम इस परिभाषा के बिना समान है। मैंने अभी परीक्षण किया है। असल में, अगर मुझे कोई फर्क नहीं पड़ता कि व्यवस्थापक साइट सबकुछ काम करती है।त्रुटि तब होती है जब मैं मॉडल साइट (उपयोगकर्ता नाम पासवर्ड और पासवर्ड पुष्टिकरण फ़ील्ड के साथ फॉर्म) में पहला उपयोगकर्ता निर्माण फ़ॉर्म भेजता हूं – bpetit

0

मैं एक समाधान मिल गया है: मैं व्यवस्थापक साइट में CustomUser रजिस्टर करने के लिए UserAdmin का उपयोग नहीं करते, मैं एक कस्टम ModelAdmin का उपयोग करें।

class CustomUserAdmin(admin.ModelAdmin): 

    add_form = CustomUserCreationAdminForm 
    add_fieldsets = (
    (None, { 
     'classes': ('wide',), 
     'fields': ('username', 'password1', 'password2')} 
    ), 
) 
    def get_fieldsets(self, request, obj=None): 
    if not obj: 
     return self.add_fieldsets 
    return super(CustomUserAdmin, self).get_fieldsets(request, obj) 

    def get_form(self, request, obj=None, **kwargs): 
    defaults = {} 
    if obj is None: 
     defaults.update({ 
      'form': self.add_form, 
      'fields': admin.util.flatten_fieldsets(self.add_fieldsets), 
     }) 
    defaults.update(kwargs) 
    return super(CustomUserAdmin, self).get_form(request, obj, **defaults) 

क्योंकि मैं एक निर्माण प्रपत्र अद्यतन रूप से अलग करना चाहते हैं, मैं मॉडल व्यवस्थापक के get_form समारोह के रूप में UserAdmin django code में किया ओवरराइड। मैं भी अपने कस्टम उपयोगकर्ता के लिए एक कस्टम निर्माण प्रपत्र बनाया है: CustomUserCreationForm

मुझे लगता है कि मेरा की तुलना में बेहतर हो सकता है Django उपयोगकर्ताओं की मेलिंग सूची में एक प्रतिक्रिया मिली: अपंजीकृत व्यवस्थापक साइट से मूल उपयोगकर्ता वर्ग और फिर रजिस्टर UserAdmin के साथ कस्टम यूज़र:

admin.site.unregister(User) 
admin.site.register(CustomUser, UserAdmin) 

अभी तक परीक्षण नहीं किया गया है।

संपादित करें: यह पिछले समाधान काम नहीं करता है

सादर

20

आप एकमात्र ऐसे उपयोगकर्ता को जोड़ने के लिए प्रपत्र को बदलने की जरूरत है (ऊपर लिख get_user_model()

पूर्ण काम कर उदाहरण पर clean_username और परिवर्तन उपयोगकर्ता (आप तो AbstractUser से विरासत में मिली)

from django.contrib.auth import get_user_model 
from django.contrib.auth.admin import UserAdmin 
from django.contrib.auth.forms import UserCreationForm, UserChangeForm 


class MyUserChangeForm(UserChangeForm): 

    class Meta: 
     model = get_user_model() 

class MyUserCreationForm(UserCreationForm): 

    class Meta: 
     model = get_user_model() 

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

class MyUserAdmin(UserAdmin): 
    form = MyUserChangeForm 
    add_form = MyUserCreationForm 
    fieldsets = (
     (None, {'fields': [('username', 'password'),]}), 
     (_('Personal info'), {'fields': ('first_name', 'last_name', 'email')}), 
     (_('Permissions'), {'fields': ('is_active', 'is_staff', 'is_superuser', 
            'groups', 'user_permissions')}), 
     (_('Important dates'), {'fields': ('last_login', 'date_joined')}), 
     ) 

admin.site.register(MyUser, MyUserAdmin) 
+0

आप समस्या को ठीक करने के लिए आवश्यक न्यूनतम उत्तर में अपना उत्तर विभाजित कर सकते हैं (यानी get_user_model का उपयोग करने और clean_username को ओवरराइट करने के लिए) सिर्फ यह ज़ोर देना कि यह सब कुछ जरूरी है। अधिक जानकारी यहां मिल सकती है (https://code.djangoproject.com/ticket/19353) –

+0

मैं इस टिकट को देखने से पहले उत्तर लिखता हूं। और अब देखें कि टिकट बंद नहीं है। – nnmware

+1

ठीक है - आपको वैसे भी +1 मिल गया है! –

4

आप शायद पूर्ण exa पर गौर करना चाहिए आधिकारिक दस्तावेज में mple:

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

कुछ खुला सवाल (अनुमतियों से निपटने, उदाहरण के लिए) कम से कम कर रहे हैं, लेकिन, यह काम कर रहा।

+0

धन्यवाद, कभी-कभी आधिकारिक संदर्भ ** रास्ता अधिक आसान और भयानक ** – arshpreet

0

UserAdmin पहले से ही योगदान के अंत में, User प्रबंधन करने के लिए पंजीकृत किया गया है/प्रमाणन/admin.py

admin.site.register(User, UserAdmin) 

आप CustomUser साथ UserAdmin पंजीकृत करना चाहते हैं, मुझे लगता है कि आप पहली बार पंजीकरण रद्द करने के लिए होगा यह देखते हुए User/UserAdmin जोड़ी:

admin.site.unregister(User) 

फिर अपना नया मॉडल पंजीकृत करें। मॉड्यूल लोडिंग के क्रम में नियंत्रण की कमी को देखते हुए, आप UserAdmin से प्राप्त कक्षा बना सकते हैं और इसके साथ अपना उपयोगकर्ता मॉडल प्रबंधित कर सकते हैं। अगर मैं ठीक से सोच रहा हूं तो यह हर बार काम करेगा।

12

मैंने इस त्रुटि के साथ घंटों तक संघर्ष किया।

from myapp.models import MyUser as User 

यह अपने कस्टम उपयोगकर्ता मॉडल मानते हुए किसी ऐप myapp कहा जाता है में है और आप मॉडल MyUser कहा जाता है: मेरे लिए मैं

from django.contrib.auth.models import User 

के सभी संदर्भ निकाल लिए और फिर से बदलने की जरूरत है।

मैं as User उपयोग कर रहा हूँ ताकि मैं बदलने की जरूरत नहीं है, जहां मेरे मौजूदा कोड है कि django.contrib.auth.models से User वस्तु के संदर्भ में आता है।

शुभकामनाएं!

एलन

@aviars

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