【问题标题】:Django Admin Create Form Inline OneToOneDjango 管理员创建表单内联 OneToOne
【发布时间】:2019-06-05 17:04:59
【问题描述】:

我有以下型号:

from django.db import models


class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    last_password_reset = models.DateTimeField(auto_now_add=True)
    needs_password_reset = models.BooleanField(default=True)
    image_url = models.URLField(max_length=500, default=None, null=True, blank=True)

我正在尝试将其内联到管理员中。我有以下内容:

from django import forms
from django.contrib.auth.models import User
from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.forms import UserCreationForm

class UserProfileInline(admin.StackedInline):
    """User profile inline."""

    model = Profile
    can_delete = False
    verbose_name_plural = "Profile"


class CustomUserCreationForm(UserCreationForm):
    """Create user form."""

    class Meta:
        model = User
        fields = ("username", "first_name", "last_name", "email")


class CustomUserAdmin(UserAdmin):
    """Custom user admin."""

    add_form = CustomUserCreationForm
    inlines = (UserProfileInline,)


admin.site.unregister(User)
admin.site.register(User, CustomUserAdmin)

这在一定程度上运行良好;当我去创建用户时,我可以看到内联的个人资料信息。但是,当我尝试提交表单时,我收到以下错误(/admin/auth/user/add/):

psycopg2.errors.NotNullViolation: null value in column "user_id" violates not-null constraint

为什么user_id 字段未填充在内联表单中?如何将此属性设置为表单创建的用户的id

【问题讨论】:

  • 数据库的设置方式可能存在问题。我刚刚在本地重新创建了您的项目,并且能够成功创建用户而没有此异常。哪个表单提交引发了异常?用户创建还是更新?
  • UserCreationFormUserAdmin 分别来自 django.contrib.auth.formsdjango.contrib.auth.admin,还是那些自定义版本?
  • @jimijimjim 我刚刚更新了问题以包含一些附加信息;创建用户失败

标签: python django django-models django-admin


【解决方案1】:

原来我需要删除一些我为自动创建配置文件而编写的信号:

# Create a profile for new users
@receiver(post_save, sender=settings.AUTH_USER_MODEL)
def create_user_profile(sender, instance=None, created=False, **kwargs):
    if created:
        Profile.objects.get_or_create(user=instance)


# Update profile on user change
@receiver(post_save, sender=User)
def save_user_profile(sender, instance=None, created=False, **kwargs):
    instance.profile.save()

【讨论】:

  • 信号与对象创建有什么关系?您只是删除了它们吗?
猜你喜欢
  • 1970-01-01
  • 2015-06-10
  • 2015-06-21
  • 1970-01-01
  • 1970-01-01
  • 2014-04-23
  • 2011-06-02
  • 2013-12-22
  • 1970-01-01
相关资源
最近更新 更多