Как я могу зарегистрировать однопользовательский процесс регистрации Django (вместо двух шагов) с обязательным по электронной почте?

Я хочу, чтобы Django отправил электронное письмо на адрес электронной почты пользователя с данными о пользователе после того, как администратор добавит нового пользователя в админ-сайт. Поэтому я попытался использовать сигналы Django для этого, но только регистрация пользователя zozzjjjo – это двухэтапные сигналы процесса, которые уведомляются на первом этапе только и называется функцией электронной почты без адреса электронной почты (что приходит на втором этапе). Мой код сигнала:

def email_new_user(sender, **kwargs): if kwargs["created"]: # only for new users new_user = kwargs["instance"] send_mail('Subject here', 'Here is the message.', 'from@example.com',['to@example.com'], fail_silently=False) post_save.connect(email_new_user, sender=User) 

Итак, что я пытался решить эту проблему. Я использую этот код в admin.py

  • Каков наиболее эффективный способ хранения списка в моделях Django?
  • Получить идентификатор объекта документа уже в коллекции mongoDB в Python
  • Ошибка формы Django / базы данных: слишком длинное значение для символа типа (4)
  • Использование интерфейса django-rest
  • Динамически исключать или включать поле в сериализатор рамки Django REST
  • Фильтровать по собственности
  •  class UserAdmin(admin.ModelAdmin): list_display = ('username', 'email', 'first_name', 'last_name', 'date_joined', 'last_login') search_fields = ['username', 'email'] filter_horizontal = ('user_permissions',) admin.site.unregister(User) admin.site.register(User, UserAdmin) 

    Это делает процесс регистрации одним шагом, и мои сигналы начинают работать и отправляют почту user_id при добавлении нового пользователя. Но проблема возникла после этого:

    1. Пароль пользователя не преобразовывается в хэш и отображается при входе в форму, что делает пользователя неспособным войти в админ-сайт.

    Поле 2.Email в форме не является обязательным, и я хочу быть обязательным.

    Пожалуйста, помогите мне 🙁

    [РЕДАКТИРОВАТЬ]

     I tried your code But I m still at same place where i was before posting this question. the code i used in my admin.py is: from django.contrib import admin from mysite.naturefarms.models import * from django.contrib.auth.models import User,Group from django.contrib.auth.admin import UserAdmin from django.contrib.auth.forms import UserCreationForm, UserChangeForm from django import forms from django.contrib.admin.views.main import * class MyUserCreationForm(UserCreationForm): class Meta: model = User fields = ('username', 'email',) class UserAdmin(admin.ModelAdmin): add_form = MyUserCreationForm admin.site.unregister(User) class MyUserAdmin(UserAdmin): add_form = MyUserCreationForm add_fieldsets = ( (None, { 'classes': ('wide',), 'fields': ('username', 'email', 'password1', 'password2')} ), ) admin.site.register(User, MyUserAdmin) 

    Это результат, который я получаю с помощью этого кода, который даже не преобразует поле пароля в хеш.

  • Как использовать десятичное число в шаблоне URL Django?
  • -bash: ./manage.py: запрещен отказ
  • Как фильтровать на рассчитанные значения модели, используя понимание списка
  • Скрипт Django для доступа к объектам модели без использования оболочки manage.py
  • Шаблон Django MVC для моделей, не поддерживающих базу данных?
  • Возвращать результаты из нескольких моделей с помощью Django REST Framework
  • 2 Solutions collect form web for “Как я могу зарегистрировать однопользовательский процесс регистрации Django (вместо двух шагов) с обязательным по электронной почте?”

    Если вы посмотрите в django.contrib.auth admin.py, вы увидите, что класс UserAdmin указывает add_form как UserCreationForm.

    UserCreationForm включает только поле «имя пользователя» из модели пользователя.

    Поскольку вы предоставляете свой собственный UserAdmin, вы можете просто переопределить add_form в пользовательскую UserCreationForm, которая включает поля, необходимые для правильной работы вашего сигнала.

    Надеюсь, что это поможет тебе.

    [Редактировать]

    Вот UserCreationForm из contrib.auth forms.py:

     class UserCreationForm(forms.ModelForm): """ A form that creates a user, with no privileges, from the given username and password. """ username = forms.RegexField(label=_("Username"), max_length=30, regex=r'^[\w.@+-]+$', help_text = _("Required. 30 characters or fewer. Letters, digits and @/./+/-/_ only."), error_messages = {'invalid': _("This value may contain only letters, numbers and @/./+/-/_ characters.")}) password1 = forms.CharField(label=_("Password"), widget=forms.PasswordInput) password2 = forms.CharField(label=_("Password confirmation"), widget=forms.PasswordInput, help_text = _("Enter the same password as above, for verification.")) class Meta: model = User fields = ("username",) def clean_username(self): username = self.cleaned_data["username"] try: User.objects.get(username=username) except User.DoesNotExist: return username raise forms.ValidationError(_("A user with that username already exists.")) def clean_password2(self): password1 = self.cleaned_data.get("password1", "") password2 = self.cleaned_data["password2"] if password1 != password2: raise forms.ValidationError(_("The two password fields didn't match.")) return password2 def save(self, commit=True): user = super(UserCreationForm, self).save(commit=False) user.set_password(self.cleaned_data["password1"]) if commit: user.save() return user 

    Обратите внимание на поля = ("username",) tuple, который исключает все остальные поля в модели User. Вам нужно что-то вроде:

     class MyUserCreationForm(UserCreationForm): class Meta: model = User fields = ('username', 'email',) 

    то вы можете использовать это как add_form в своем пользовательском UserAdmin:

     class UserAdmin(admin.ModelAdmin): add_form = MyUserCreationForm 

    Это довольно поздно в моей части света, но я посмотрю, смогу ли я получить рабочий образец для вас завтра.

    [Редактировать]

    Хорошо, вот необходимые изменения, которые вам нужно сделать, чтобы сделать эту работу. Я тестировал его с помощью Django 1.3:

     from django.contrib.auth.forms import UserCreationForm from django.contrib.auth.admin import UserAdmin from django.contrib.auth.models import User from django import forms admin.site.unregister(User) class MyUserAdmin(UserAdmin): add_form = MyUserCreationForm add_fieldsets = ( (None, { 'classes': ('wide',), 'fields': ('username', 'email', 'password1', 'password2')} ), ) admin.site.register(User, MyUserAdmin) 

    Я не видел, что у UserAdmin было свойство add_fieldset. Вот почему поле электронной почты не отображалось в форме добавления.

    В этом примере попробуйте указать адрес электронной почты в своей пользовательской форме UserCreationForm по необходимости = True:

     class MyUserCreationForm(UserCreationForm): email = forms.EmailField(required=True) class Meta: model = User fields = ('username', 'email',) 
    Python - лучший язык программирования в мире.