2014-11-26 5 views
0

Я использую Django 1.7.1, и здесь я столкнулся с проблемой, которая не должна была иметь место.Новое поле в django-admin Добавить пользователя

Фон: Я работаю над пользовательской моделью на основе AbstractUser. На данный момент - у меня есть еще одно поле (для тестирования) и планируется добавить больше. Как-то мне удалось заставить его работать с DjangoAdmin, используя UserChangeForm с классом Meta.

Проблема: согласно Django-docs нет необходимости делать что-либо еще, чтобы получить возможность видеть, редактировать и добавлять значение для каждого поля на моем сайте DjangoAdmin. К сожалению - просмотр и редактирование работают так, как ожидалось, но когда дело доходит до «Добавить нового пользователя» от DjangoAdmin - я все еще вижу только три поля: «Username», «Password» и «Password Confirm».

Вопрос: Где мне изменить/поместить некоторый код, чтобы получить возможность заполнить больше полей, пока я создаю нового пользователя DjangoAdmin?

Окончание: Да. Я пробовал много результатов в Google (в том числе используя методы «fieldsets», «list_display», «inline» и т. Д.). Насколько это возможно - я также хотел бы избежать использования OneToOne отношения с моделью пользователя. Это породило так много ошибок, что я отказался от него, и я не хочу быть там. Если есть такая необходимость, я дам фрагменты кода.

Спасибо за помощь заранее .

+0

Документах дают пример очень углубленный пользовательской модели пользователя, в том числе custom 'UserCreationForm' https://docs.djangoproject.com/en/1.7/topics/auth/customizing/#a-full-example – Ngenator

+0

Я подал заявку на django- docs, поэтому, если он не был достаточно ясным - я тоже пробовал эти решения. Кажется, проблема здесь связана с линией: add_form = UserCreationForm. Похоже, нет никаких последствий этого, и я не могу понять, почему. Во-вторых: использование AbstractBaseUser вместо AbstractUser генерирует весь новый набор ошибок. – wisienka91

+0

Ну, на ваш вопрос ответили тогда, вот и все. Если у вас возникли проблемы с тем, как вы его реализовали, нет ничего, что можно было бы сделать, не видя ваш код. – Ngenator

ответ

1

Я не уверен, была ли проблема связана с определенным порядком строк в классе NewUserAdmin или чем-то еще - еще не проверила его, но я уверен, что был близок к этому решению гораздо раньше. то, о чем я говорил (работает t он способ, которым я хотел это :)). Теперь я могу легко добавить любое поле в модель пользователя, и оно все еще связано со всеми функциями фреймворка, такими как управление сеансами и т. Д. Более того, я не использую поле AbstractBaseUser и OneToOne, что вызвало массу проблем. В любом случае - спасибо за любой способ помощи. Я бы не разрешил это без вас ... ... на этой неделе: D

PS Я пропустил весь импорт. IDE расскажет вам, что нужно.

models.py

class NewUserManager(UserManager): 
def create_user(self, username, email=None, password=None, **extra_fields): 
    return UserManager.create_user(self, username, email=email, password=password, **extra_fields) 

def create_superuser(self, username, email, password, **extra_fields): 
    return UserManager.create_superuser(self, username, email, password, **extra_fields) 

class NewUser(AbstractUser): 
    newField = models.CharField()  # for example CharField 
    newField = models.CharField(max_length = 12) # important thing - properties should be in the second line 
    objects = NewUserManager() 

    class Meta(AbstractUser.Meta): 
     swappable = 'your_app_name.NewUser' 
     #db_table = 'auth_user'  

forms.py

class NewUserCreationForm(forms.ModelForm): 
    password1 = forms.CharField(label='Password', widget=forms.PasswordInput) 
    password2 = forms.CharField(label='Password confirmation', widget=forms.PasswordInput) 

    class Meta: 
     model = NewUser 
     fields = ('username', 'email', 'first_name', 'last_name', 'newField')  # few example fields and new one: newField 

    def clean_password2(self): 
     password1 = self.cleaned_data.get("password1") 
     password2 = self.cleaned_data.get("password2") 
     if password1 and password2 and password1 != password2: 
      raise forms.ValidationError("Passwords don't match") 
     return password2 

    def save(self, commit=True): 
     user = super(NewUserCreationForm, self).save(commit=False) 
     user.set_password(self.cleaned_data["password1"]) 
     if commit: 
      user.save() 
     return user 

class NewUserChangeForm(UserChangeForm): 
    class Meta(UserChangeForm.Meta): 
     model = NewUser 
     fields = ('username', 'email', 'first_name', 'last_name', 'newField', 'last_login', 'is_staff')  # few example fields and new one: newField  

admin.py

class NewUserAdmin(UserAdmin): 
    form = NewUserChangeForm 
    add_form = NewUserCreationForm 

    list_display = ('username', 'newField', 'first_name', 'last_name', 'last_login',)  # few example fields and new one: newField 
    fieldsets = (
     (None, {'fields': ('username', 'email', 'first_name', 'last_name', 'newField', 'last_login', 'is_staff')}), # few example fields and new one: newField 
) 

    add_fieldsets = (
     (None, { 
     'classes': ('wide',), 
     'fields': ('username', 'newField', 'password1', 'password2')} # here are fields you want to have in django-admin AddUser view 
    ),   # one of the most important place above 
) 

admin.site.register(NewUser, NewUserAdmin) 
Смежные вопросы