【问题标题】:NOT NULL constraint failed errorNOT NULL 约束失败错误
【发布时间】:2014-12-30 21:34:09
【问题描述】:

当我尝试提交表单时,我不断收到此错误:“NOT NULL constraint failed: users_userprofile.user_id”

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

class UserProfile(models.Model):
    #Esta linea es requerira. Linkea UserProfile a un User model
    user = models.OneToOneField(User)

    #atributos adicionales
    about_me = models.TextField(max_length=100,default='',blank=True)
    experience = models.TextField(max_length=250,default='',blank=True)
    offers = models.TextField(max_length=110,default='',blank=True)

这是forms.py: 从 django 导入表格 从 users.models 导入 UserProfile from django.contrib.auth.models 导入用户

class UserForm(forms.ModelForm):
    password = forms.CharField(min_length=6,label='', widget=forms.PasswordInput(attrs={'placeholder': 'Password','required':'true','class':"form-control"}))
    username = forms.CharField(label='', min_length=6,
                    widget=forms.TextInput(attrs={'placeholder': 'Username','required':'true','class':"form-control",'autofocus':'true'}))
    email = forms.CharField(label='', 
                    widget=forms.TextInput(attrs={'placeholder': 'Email','required':'true','class':"form-control"}))

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

class UserProfileForm(forms.ModelForm):
    about_me = forms.CharField(label='', 
                    widget=forms.Textarea(attrs={'placeholder': 'Sobre mi','required':'true','class':"form-control"}))
    first_name = forms.CharField(label='', 
                    widget=forms.TextInput(attrs={'placeholder': 'Nombre','required':'true','class':"form-control"}))
    last_name = forms.CharField(label='', 
                    widget=forms.TextInput(attrs={'placeholder': 'Apellidos','required':'true','class':"form-control"}))
    experience = forms.CharField(label='', 
                    widget=forms.TextInput(attrs={'placeholder': 'Experiencia','required':'true','class':"form-control"}))
    offers = forms.CharField(label='', 
                    widget=forms.Textarea(attrs={'placeholder': 'Mensaje','required':'true','class':"form-control"}))

    class Meta:
        model = UserProfile
        fields =('first_name','last_name','about_me','experience','offers')

这是模板:

{%extends 'base.html'%}

{%block content%}
{% if user.is_authenticated %}
<h1>Edita tu perfil</h1>
<form id='profile' method='post' action='/edit_profile/'>
{% csrf_token %}

{{profile.as_p}}

<button type='submit'>Editar</button>
</form>
{%endif%}

{%endblock%}

提前致谢

编辑:

错误出现在views.py中,我需要在表单中添加一个实例,如下所示:

form = UserProfileForm(data=request.POST, instance=profile)

这是我完整的views.py:

def edit_profile(request):
    try:
        profile = request.user.userprofile

    except UserProfile.DoesNotExist:

        profile = UserProfile(user=request.user)

    if request.method == 'POST':
        form = UserProfileForm(data=request.POST, instance=profile)

        if form.is_valid():

            form.save()

            return HttpResponse("Exito!")
        else:
            form = UserProfileForm(instance=profile)

    else:
        form = UserProfileForm()

    return render(request,
            'editprof.html',
            { 'form': form})

【问题讨论】:

  • 您能否更清楚地阐述您的问题?
  • 在使用表单时,您似乎必须提交user 字段。但是如果没有看到您的表单代码,我无法确定您的问题是什么。

标签: python django python-2.7


【解决方案1】:

问题是UserProfile 中的user 是必需的,但您没有在UserProfileForm 中设置user 字段。数据库没有得到user_id,所以它试图在这个字段上设置null,但是这个字段没有null约束。您可以在UserProfile 模型中的字段定义上设置null=True,或覆盖save(或可能is_valid)表单方法以自动设置用户或将用户字段添加到UserProfileForm,或任何您想要的。

【讨论】:

  • 谢谢!,我的错误在views.py中,我有form = UserProfileForm(data=request.POST) 并添加了form = UserProfileForm(data=request.POST, instance=profile) 和它有效,我认为错误出在表格或其他东西中
【解决方案2】:

在你的模型中给出一个空值

    user = models.OneToOneField(User, null=True)
    about_me = models.TextField(max_length=100,default='',blank=True, null=True)
    experience = models.TextField(max_length=250,default='',blank=True, null=True)
    offers = models.TextField(max_length=110,default='',blank=True, null=True)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-31
    • 2015-04-22
    • 2018-08-24
    • 2022-01-19
    • 2021-11-16
    • 2020-12-18
    相关资源
    最近更新 更多