为特定用户创建Profile模型(Django 4.0)?

bvk5enib  于 2023-08-08  发布在  Go
关注(0)|答案(2)|浏览(101)

有谁知道如何在完成注册表格后为用户创建一个配置文件???(Django)
网址:views.py

class UserRegisterView(generic.CreateView):
    form_class = SignUpForm #Imported from forms
    template_name = 'registration/register.html'
    success_url = reverse_lazy('login')

    def form_valid(self, form):
        response = super().form_valid(form)
        return response

字符串
models.py

class Profile(models.Model):
    user = models.OneToOneField(User, null=True, on_delete=models.CASCADE)
    #rpg_class = models.CharField(max_length=100)

    def __str__(self):
        return str(self.user)    

                                                                      
@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
    if created:
        Profile.objects.create(user=instance)

@receiver(post_save, sender=User)
def save_user_profile(sender, instance, **kwargs):
    instance.profile.save()


我试过这个,它不起作用,它说的东西像

Internal Server Error: /CodeRPGappMain/register/
Traceback (most recent call last):
  File "C:\Users\Admin\AppData\Local\Programs\Python\Python310\lib\site-packages\django\db\backends\utils.py", line 89, in _execute
    return self.cursor.execute(sql, params)
  File "C:\Users\Admin\AppData\Local\Programs\Python\Python310\lib\site-packages\django\db\backends\sqlite3\base.py", line 328, in execute
    return super().execute(query, params)
sqlite3.IntegrityError: NOT NULL constraint failed: CodeRPGappMain_profile.bio


在管理中手动创建一个配置文件是行不通的,所以我需要它自动创建自己每次用户注册时,它已经创建了一个Djangos内置的东西,但我需要创建其自定义模型完成后的用户配置文件的用户bc

pexxcrt2

pexxcrt21#

这(可能)不起作用的原因是因为您的Profile有一个bio字段不是**null=True[Django-doc],并且没有default=…**[Django-doc],因此在创建Profile时,它没有值可以填充bio

@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
    if created:
        Profile.objects.create(user=instance, bio='')

字符串
您可能需要手动设置其他字段,或者定义default=…值。
无论如何,使用信号通常不是一个好主意。例如,当您批量创建或更新项目时,信号不起作用。你可以只使用视图并覆盖admin,* 而不使用 * 信号:

class UserRegisterView(generic.CreateView):
    form_class = SignUpForm  # Imported from forms
    template_name = 'registration/register.html'
    success_url = reverse_lazy('login')

    def form_valid(self, form):
        response = super().form_valid(form)
        Profile.objects.create(user=self.object, bio='')
        return response


在管理层中:

# app_name/admin.py

from django.contrib import admin
from django.contrib.auth import get_user_model

User = get_user_model()

admin.site.unregister(User)

@admin.register(User)
class ArticleAdmin(admin.ModelAdmin):
    def save_model(self, request, obj, form, change):
        super().save_model(request, obj, form, change)
        if obj._state.adding:
            Profile.objects.create(user=obj, bio='')

hgqdbh6s

hgqdbh6s2#

首先,你不需要在create()之后使用save()方法。create()方法只需一步即可创建和保存对象。
这里的问题是:sqlite3.IntegrityError: NOT NULL constraint failed: CodeRPGappMain_profile.bio。看起来你玩了Profile模型,并以某种方式添加了生物字段。
怎么修?
如果你不关心你的数据,只需删除.sqlite3数据库文件和迁移文件夹中的所有迁移(除了__init__.py)。然后makemigrations()migrate(),一切都将工作。
或者,将bio field添加回模型。您可以提供default=''null=True来不关心初始值并避免问题。

相关问题