2012-06-21 6 views
0

У меня есть приложение с 2 уровнями пользователей; Суперпользователь и персонал. Superuser войдет в это приложение и создаст нового пользователя и назначит пользователю разрешения для суперпользователя или персонала, но они не войдут в систему с помощью администратора Django по умолчанию, они будут входить в пользовательский админ. Как показать флажки разрешения в моей форме и как сохранить их для создаваемого нового пользователя? Это просто нормальный флажок или есть что-то, что мне нужно переопределить, чтобы выполнить это?Разрешения Django за пределами администратора и в пользовательской форме

Вот мой CreateUserForm, как сейчас.

class CreateUserForm(forms.Form): 
    username = forms.EmailField(max_length=50) 
    email = forms.EmailField() 
    first_name = forms.CharField(max_length=150) 
    last_name = forms.CharField(max_length=150) 
    password1 = forms.CharField(max_length=30, widget=forms.PasswordInput(render_value=False), label='Password') 
    password2 = forms.CharField(max_length=30, widget=forms.PasswordInput(render_value=False), label='Password Confirmation') 
    address_1 = forms.CharField(max_length=50) 
    address_2 = forms.CharField(max_length=50) 
    city = forms.CharField(max_length=50) 
    province = forms.CharField(max_length=2) 
    country = forms.CharField(max_length=50) 
    postal_code = forms.CharField(max_length=10) 
    work_phone = forms.CharField(max_length=20) 
    mobile_phone = forms.CharField(max_length=20) 
    fax = forms.CharField(max_length=20) 
    url = forms.CharField() 
    comments = forms.CharField(widget=forms.Textarea) 

    def clean_username(self): 
     try: 
      User.objects.get(username=self.cleaned_data['username']) 
     except User.DoesNotExist: 
      return self.cleaned_data['username'] 
     raise forms.ValidationError("Sorry, this username has already been taken. Please choose another.") 

    def clean_email(self): 
     try: 
      User.objects.get(email=self.cleaned_data['email']) 
     except User.DoesNotExist: 
      return self.cleaned_data['email'] 
     raise forms.ValidationError("Sorry, this email has already been taken. Please choose another.") 

    def clean(self): 
     if 'password1' in self.cleaned_data and 'password2' in self.cleaned_data: 
      if self.cleaned_data['password1'] != self.cleaned_data['password2']: 
       raise forms.ValidationError("You must type the same password each time.") 
      if ' ' in self.cleaned_data['username']: 
       raise forms.ValidationError("username must not contain spaces") 
     return self.cleaned_data 

    def save(self): 
     new_user = User.objects.create_user(
      username = self.cleaned_data['username'], 
      email = self.cleaned_data['email'] 
     ) 
     new_user.first_name = self.cleaned_data['first_name'] 
     new_user.last_name = self.cleaned_data['last_name'] 
     new_user.set_password(self.cleaned_data['password']) 
     new_user.is_active = True 
     new_user.save() 

    new_profile = UserProfile(
     # TODO: 
    ) 

Благодаря

ответ

2

Если вы имеете в виду разрешения флажками is_staff и is_superuser, то вы, вероятно, лучше с помощью ModelForm ж/модели пользователя. Это автоматически позаботится обо всем для вас.

class UserForm(forms.ModelForm): 
    class Meta: 
     model = User 
     exclude = ('last_login', 'date_joined') 

EDIT на обновление OP: Вы можете просто добавить 2 forms.BooleanField() поля в форму для is_superadmin и is_staff (или назвать их по-разному), и так же, как вы уже делаете в методе экономии вы можете сделать new_user.is_staff = self.cleaned_data['is_staff']. Вместо этого вы можете использовать поле выбора, выпадающее меню с 3 записями, «Обычный пользователь», «Пользовательский пользователь», «Пользователь-администратор», а затем установите значение is_staff и is_superadmin в соответствии с выбором пользователя.

Также можно использовать модель модели в модели User и просто добавить дополнительные дополнительные поля. Он может быть или не быть достоин этого, в зависимости от того, как вы получаете.

Еще одна заметка о вашей форме - когда дело доходит до редактирования существующих пользователей, это не будет использоваться для этого с текущими методами очистки по имени пользователя/электронной почте. Но если вы настроите их, чтобы исключить текущий экземпляр (если он установлен) из поиска, вы сможете использовать эту форму для редактирования существующих пользователей (хотя, поскольку это не форма модели, вам нужно будет вручную заполнить исходные данные).

+0

Дэн, у меня есть куча других пользовательских материалов в этой форме, а также пользовательская пользовательская модель для каждого пользователя. Разве это не проблема? – JeffC

+0

Трудно сказать, не видя кода; возможно, обновите сообщение с тем, что у вас есть. –

+0

Готово. Он еще не завершен, может быть, 90%, но этого должно быть достаточно, чтобы дать представление. – JeffC

Смежные вопросы