Заполнение UserProfile при регистрации пользователя - PullRequest
0 голосов
/ 11 марта 2019

Я пытаюсь заполнить поле профиля пользователя при регистрации пользователя (я читал, что это не рекомендуется, но требуется для моего приложения)

model.py

class UserProfile(models.Model):
user = models.OneToOneField(User,on_delete=models.CASCADE)

twitter = models.CharField(max_length=50)

def create(sender, **kwargs):
    if kwargs['created']:
        user_profile = UserProfile.objects.create(user=kwargs['instance'])

post_save.connect(create, sender=User)

view.py

def register(request):
if request.method == 'POST':
    form = RegForm(request.POST)
    if form.is_valid():
        form.save()
        return redirect('/home')
else:
    form = RegForm()

    args = {'form': form}
    return render(request, 'home/registration_form.html', args)

form.py

class RegForm(UserCreationForm):
    email = forms.EmailField(required=True)
    username = forms.CharField(max_length=50, required=True)
    twitter = forms.CharField(max_length=50, required=True)

    class Meta:
         model = User
         fields = (
            'username',
            'twitter',
            'first_name',
            'last_name',
            'email',
            'password1',
            'password2'
        )

    def save(self, commit=True):
        user = super(RegForm, self).save(commit=False)
        user.username = self.cleaned_data['username']
        user.first_name = self.cleaned_data['first_name']
        user.last_name = self.cleaned_data['last_name']

        user.email = self.cleaned_data['email']
        user.userprofile.twitter = self.cleaned_data['twitter']

       if commit:
           user.save()

       return user

В настоящее время я получаю сообщение об ошибке «У пользователя нет профиля пользователя»

(впервые с использованием Djangoизвините, если это глупый вопрос, я не смог найти ничего, что помогло бы онлайн)

Traceback:

File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6 / site-packages / django / db / backends / utils.py "в _execute 85. вернуть self.cursor.execute (sql, params)

File" /Library/Frameworks/Python.framework/Версии / 3.6 / lib / python3.6 / site-packages / django / db / backends / sqlite3 / base.py "в execute 298. return Database.Cursor.execute (self, query, params)

Theвышеприведенное исключение (ограничение NOT NULL не выполнено: app_userprofile.user_id) было прямой причиной следующего исключения:

File "/Library/Frameworks/Python.framework / Versions / 3.6 / lib / python3.6 / site-packages / django / core / handlers / exception.py "во внутреннем 34. response = get_response (запрос)

File" / Library / Frameworks / Python.framework / Versions / 3.6 / lib / python3.6 / site-packages / django / core / handlers / base.py "в _get_response 126. response = self.process_exception_by_middleware (e, request)

File" /Библиотека / Каркасы / Python.framework / Версии / 3.6 / lib / python3.6 / site-packages / django / core / handlers / base.py "в _get_response 124. response = wrapped_callback (запрос, * callback_args, ** callback_kwargs)

Файл "/Users/IS/Desktop/Project/website/app/views.py" в реестре 37. form.save ()

Файл "/ Users / IS / Desktop / Project /website / app / form.py "в save 42. profile.save ()

File" /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/db / models / base.py "в save 718. force_update = force_update, update_fields = update_fields)

Файл" /Library/Frameworks/Python.framework/Versions/3.6 / lib / python3.6 / site-packages / django / db / models / base.py "в save_base 748. updated = self._save_table (raw, cls, force_insert, force_update, using, update_fields)

Файл "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/db/models/base.py" в _save_table 831. result = self._do_insert (cls._base_manager, используя, поля, update_pk, raw)

Файл "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/db/models/base.py" в _do_insert869. using = using, raw = raw)

Файл "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/db/models/manager.py"в manager_method 82. вернуть getattr (self.get_queryset (), name) (* args, ** kwargs)

File" /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/db/models/query.py "в _insert 1136. вернуть query.get_compiler (using = using) .execute_sql (return_id)

File" /Library/Frameworks/Python.framework / Versions / 3.6 / lib / python3.6 / site-packages / django / db / models / sql / compiler.py "в execute_sql 1289. cursor.execute (sql, params)

Файл" / Библиотека/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/db/backends/utils.py "в execute 100. вернуть super (). Execute (sql, params)

Файл "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/db/backends/utils.py" в execute 68. вернуть self._execute_with_wrappers (sql, params,many = False, executor = self._execute)

File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/db/backends/utils.py"в _execute_with_wrappers77. вернуть исполнителя (sql, params, many, context)

Файл "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/db/backends/utils.py" в _execute 85. вернуть self.cursor.execute (sql, params)

Файл "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/db/utils.py" в выход 89. повысить dj_exc_value.with_traceback (traceback) из exc_value

Файл "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/db/backends/utils.py" в _execute 85. вернуть self.cursor.execute (sql, params)

Файл "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/db/backends/sqlite3/base.py" в исполнении 298. return Database.Cursor.execute (self, query, params)

Тип исключения: IntegrityError в / app / register / Значение исключения: ограничение NOT NULL не выполнено: app_userprofile.user_id

1 Ответ

0 голосов
/ 11 марта 2019

Не уверен, где вы читали, что вы не должны этого делать;это нормально.

Поскольку вы создаете пользователя, вам также необходимо создать профиль пользователя.

user = super(RegForm, self).save(commit=False)
profile = UserProfile(user=user, twitter=form.cleaned_data["twitter"]
if commit:
    user.save()
    profile.save()

Но теперь, когда вы сделали это, вы должны удалить этот сигнал.Вам это не нужно.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...