簡體   English   中英

/ accounts / regist_save /發生IntegrityError

[英]IntegrityError at /accounts/regist_save/ happens

/ accounts / regist_save / NOT NULL約束處的IntegrityError失敗:accounts_newuser.user_id錯誤發生。

views.py

def regist(request):
    regist_form = RegisterForm(request.POST or None)
    profile_form = ProfileForm(request.POST or None)
    context = {
        'regist_form': regist_form,
        'profile_form': profile_form, 
    }
    return render(request, 'registration/regist.html', context)

@require_POST
def regist_save(request):

    regist_form = RegisterForm(request.POST or None)
    profile_form = ProfileForm(request.POST or None)

    if request.method == "POST" and regist_form.is_valid() and profile_form.is_valid():
                regist = regist_form.save(commit=False)
                regist.is_staff = True
                regist.save()

                profile = profile_form.save(commit=False)
                sex = request.POST.get("sex", "")
                print(1111)
                print(sex)
                profile.save()
    else:
        print(regist_form.errors)
        print(profile_form.errors)
    return redirect('detail')

regist.html

 <div class="form-group-lg">

    <label for="id_username">Username</label>

    {{ regist_form.username }}

  </div>

  <div class="form-group-lg">

    <label for="id_email">Email</label>

    {{ regist_form.email }}
  </div>

  <div class="form-group-lg">

    <label for="id_password">Password</label>

    {{ regist_form.password1 }}

  </div>



  <div class="form-group-lg">
    <label for="id_password">Password2</label>

    {{ regist_form.password2 }}
    <p class="help-block">{{ regist_form.password2.help_text }}</p>

  </div>



  {% load static %}
  <div class="form-group-lg">
    <label for="birthday">Date</label>

    <select id="year" class="form-control year" name="year">
      <option value="">--</option>
    </select>
    Year
    <select id="month" class="form-control month" name="month">
      <option value="">--</option>
    </select>
    Month
    <select id="day" class="form-control day" name="day">
      <option value="">--</option>
    </select>
    Day
    <br>
    <br>
  </div>

  <div class="form-group-lg">
    <label for="sex">SEX</label>
    <select id="sex" class="form-control sex" name="sex">
      <option value="">--</option>
      <option value="male">male</option>
      <option value="female">female</option>
    </select>
  </div>


  <script src="{% static 'accounts/register.js' %}"></script>


      <button type="submit" class="btn-lg regist">REGIST</button>

      <input name="next" type="hidden" />

  {% csrf_token %}

</form>

regist.js

$(() => {
    for (let i = 1900; i < 2020; i++) {
        $("#year").append(`<option value="${i}">${i}</option>`);
    }
    for (let i = 1; i < 12; i++) {
        $("#month").append(`<option value="${i}">${i}</option>`);
    }
    for (let i = 1; i < 31; i++) {
        $("#day").append(`<option value="${i}">${i}</option>`);
    }
})

models.py

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

    class NewUser(models.Model):
        user = models.OneToOneField(User, on_delete=models.CASCADE)
        birthday = models.CharField(max_length=100,null=True, blank=True, default=None)
        sex = models.CharField(max_length=100,null=True, blank=True, default=None)

在forms.py中

from django import forms
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.forms import AuthenticationForm
from .models import User
from .models import NewUser

class RegisterForm(UserCreationForm):
    class Meta:
        model = User
        fields = ('username', 'email','password1','password1',)
    def __init__(self, *args, **kwargs):
        super(RegisterForm, self).__init__(*args, **kwargs)
        self.fields['username'].widget.attrs['class'] = 'form-control'
        self.fields['email'].widget.attrs['class'] = 'form-control'
        self.fields['password1'].widget.attrs['class'] = 'form-control'
        self.fields['password2'].widget.attrs['class'] = 'form-control'

class ProfileForm(forms.ModelForm):
    class Meta:
        model = NewUser
        fields = (
            "birthday", "sex"
        )

我真的不明白為什么會發生此錯誤,因為我沒有在NewUser模型中編寫user_id。我認為完整性錯誤意味着無法在Model.OneToOneField找到列Model.OneToOneField可以與User和NewUser的模型連接。我認為該錯誤意味着我應該在Model.OneToOneField中准備user_id用戶模型,但是如果我的想法是正確的,我將無法理解為什么。應該如何解決?應該怎么寫?

發生這種情況是因為在NewUser模型中, 用戶字段是必填字段。 在ProfileForm中,不包括用戶字段。 因此,當ProfileForm嘗試保存沒有用戶附加的NewUser時,將導致上述錯誤。

我們要做的是在實際保存發生之前將用戶附加到實例:

profile = profile_form.save(commit=False)
profile.user = registered_user # you can get the user from the registerform above
profile.save()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM