Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python models.py和views.py可能相互冲突_Python_Django - Fatal编程技术网

Python models.py和views.py可能相互冲突

Python models.py和views.py可能相互冲突,python,django,Python,Django,下面是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 im

下面是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) 在my models.py中,我有4个字段,“用户”、“用户名”、“密码”、“电子邮件”。在我的第一个字段“user”中,我想,我不应该使用“models.OneToOneField(user,on_delete=models.CASCADE)”,因为根据我的理解,它是在工作中有主键和外键时使用的。如果我错了,请纠正我

2) 在my 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)

出现错误的原因是
用户
保存后信号试图创建
注册
实例,但没有为所有必需字段提供值

@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()
提供有效参数

不,你没有道理。你为什么有这种注册模式?所有这些字段都已在用户上。使用单独模型的唯一原因是,如果要存储用户模型中尚未存储的额外信息。除此之外,您不得以明文形式存储密码;这就是为什么用户模型有设置密码的方法。只需完全删除注册。当我删除注册模型并尝试创建超级用户时,我得到“django.db.utils.IntegrityError:UNIQUE constraint failed:auth_user.username”错误注册表单的定义在哪里?添加到我的原始查询中实际上我注意到你的问题是关于createsuperuser的。因此,形式和观点与此毫无关系;我真的不明白为什么你的标题谈论的是相互冲突的观点。在任何情况下,请发布您现在使用的代码和完整的回溯。PS:我假设这个应用程序是一个学习练习。在决定编写自己的代码来处理密码和用户详细信息之前,您应该仔细阅读django文档并理解它。django用户认证系统是由专家编写的。如果您编写自己的代码来处理密码等,您的应用程序将非常不安全,这是一个巨大的风险。这就像买了一个超级昂贵的家庭安全系统,然后把钥匙和报警密码放在门垫下让任何人都能找到。因此,如果我理解正确,除非我希望扩展用户身份验证,我不应该覆盖默认的“用户”模型。由于我没有定制任何东西,我也不需要定制信号。信号部分也由“用户”模型负责。如果我使用默认设置,请纠正我的错误。然后,如果我的理解正确,models.py将是空的。我已经用models.pylast的当前外观在我的原始查询中添加了这个片段,但并非最不重要的是,我已经浏览了“用户”模型的django 1.11文档。它所得到的只是这里提到的一系列函数。这并不是在解释如何使用它们以及在哪里使用它们,如果你能在这方面帮助我,那就太好了。你可以通过对AbstractBaseUser子类化来创建自定义用户模型。这样,您就可以使用现有的密码和身份验证系统,只需添加对自定义用户模型安全性不重要的额外字段。相关文件在这里:嗯,我想,这就是我想要的。非常感谢。可以得出结论