【问题标题】:models.py and views.py may be conflictingmodels.py 和 views.py 可能有冲突
【发布时间】:2017-11-02 14:42:36
【问题描述】:

下面是models.py的输出

from django.db import models
from django.core.urlresolvers import reverse
#from django.core.urlresolvers import reverse
from django.contrib.auth.models import User
from django.db.models.signals import post_save
from django.dispatch import receiver

class Registration(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    username = models.CharField(max_length = 250)
    password = models.CharField(max_length = 250)
    email = models.CharField(max_length = 250)

@receiver(post_save, sender=User)
def update_user_profile(sender, instance, created, **kwargs):
    if created:
        Registration.objects.create(username=instance)
    instance.registration.save()

下面是views.py的输出

from django.shortcuts import render, redirect
from django.contrib.auth import authenticate, login
from django.contrib.auth.forms import UserCreationForm
from .forms import SignUpForm
from django.views import generic

class IndexView(generic.View):
    templet_name = 'user_info/index.html'


def signupview(request):
    if request.method == 'POST':
        form = SignUpForm(request.POST)
        if form.is_valid():
            form.save()
            username = form.cleaned_data.get('username')
            raw_password = form.cleaned_data.get('password')
            user = authenticate(username=username, password=raw_password)
            login(request, user)
            return redirect('registration_form.html')

    else:
        form = SignUpForm()
    return render(request,'user_info/registration_form.html',  {'form': form})

我有两个问题:

1) 在我的 models.py 中有 4 个字段,“用户”、“用户名”、“密码”、“电子邮件”。在我的第一个字段“用户”中,我想,我不应该使用“models.OneToOneField(User, on_delete=models.CASCADE)”,因为据我了解,当我们有主键和外键时使用它运行中。如果我错了,请纠正我。

2)在我的views.py中,函数“signupview”,我是通过form.save()将表单保存到数据库中,然后清理数据。我做对了吗,因为我的 models.py 有 4 个字段,但是在 view.py 中,我只给出了两个字段

username = form.cleaned_data.get('username')
raw_password = form.cleaned_data.get('password')

我希望我在这里说得通。通过

创建超级用户时出现错误
python manage.py createsupseruser

下面是错误

django.db.utils.IntegrityError: NOT NULL constraint failed: user_info_registration.user_id

这就是我问这些问题的原因。

forms.py

from django.contrib.auth.models import User
from django.contrib.auth.forms import UserCreationForm
from django import forms
#from django.forms import ModelForm

class SignUpForm(UserCreationForm):
    #first_name = forms.CharField(max_length=30, required=False, help_text='Optional.')
    #last_name = forms.CharField(max_length=30, required=False, help_text='Optional.')
    email = forms.EmailField(max_length=254, help_text='Required. Inform a valid email address.')

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

models.py 的最新外观:

from django.db import models
from django.contrib.auth.models import User

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

【问题讨论】:

  • 不,你说不通。为什么你有那个注册模型?所有这些字段都已经在用户上。拥有单独模型的唯一原因是如果您想存储尚未在 User 模型中的额外信息。除此之外,您不得以纯文本形式存储密码;这就是为什么 User 模型有设置密码的方法。只需完全删除注册。
  • 当我删除注册模型并尝试创建超级用户时,我得到“django.db.utils.IntegrityError: UNIQUE constraint failed: auth_user.username”错误
  • SignupForm的定义在哪里?
  • 添加到我的原始查询中
  • 其实我只是注意到你的问题是关于createsuperuser。所以表单和视图与它没有任何关系;我真的不明白为什么你的标题谈到观点冲突。无论如何,请发布您现在使用的代码和完整的回溯。

标签: python django


【解决方案1】:

您收到错误的原因是User 保存后信号尝试创建Registration 实例,但您没有为所有必填字段提供值。

@receiver(post_save, sender=User)
def update_user_profile(sender, instance, created, **kwargs):
    if created:
        Registration.objects.create(username=instance) 
    instance.registration.save()

您要么必须删除此信号处理程序,要么必须向Registration.objects.create() 提供有效参数。

【讨论】:

  • PS:我认为这个应用程序是一个学习练习。在决定编写自己的代码来处理密码和用户详细信息之前,您应该仔细阅读 django 文档并理解它。 django 用户认证系统由专家编写。如果您编写自己的代码来处理密码等,那么您的应用程序将面临非常不安全的巨大风险。这就像买了一个超级昂贵的家庭安全系统,然后把钥匙和警报密码放在门垫下面,任何人都可以找到。
  • 所以,如果我理解正确,除非我希望扩展用户身份验证,否则我不应该覆盖默认的“用户”模型。而且由于我没有定制任何东西,我也不需要定制信号。如果我使用默认设置,信号部分也由“用户”模型处理,如果我错了,请纠正我。然后,如果我的理解是正确的,那么 models.py 将是空的。我在我的原始查询中添加了 sn-p 以及我当前的 models.py
  • 最后但并非最不重要的一点是,我已经阅读了 django 1.11 文档中的“用户”模型。它所拥有的只是那里提到的一堆功能。它没有解释,如何使用它们以及在哪里使用它们,如果你能在这部分帮助我,那就太好了。
  • 您可以通过继承 AbstractBaseUser 来创建自定义用户模型。这样,您可以使用现有的密码和身份验证系统,只需添加对您的自定义用户模型安全性不重要的额外字段。相关文档在这里:docs.djangoproject.com/en/1.11/topics/auth/customizing/…
  • 嗯,我想,这就是我想要的。谢谢你。线程可以结束了
猜你喜欢
  • 2021-08-29
  • 1970-01-01
  • 2019-11-22
  • 1970-01-01
  • 1970-01-01
  • 2014-03-23
  • 1970-01-01
  • 2021-12-31
  • 1970-01-01
相关资源
最近更新 更多