【问题标题】:Django Update AbstractUserDjango 更新 AbstractUser
【发布时间】:2022-01-23 04:45:36
【问题描述】:
IntegrityError at /
NOT NULL constraint failed: pages_profile.username
Request Method: POST
Request URL:    http://127.0.0.1:8000/
Django Version: 3.2.9
Exception Type: IntegrityError
Exception Value:    
NOT NULL constraint failed: pages_profile.username

如何使用已登录的表单从发布请求中更新 abstractuser?

from django.shortcuts import redirect, render
from .forms import UserProfileForm
from .models import Profile

def index(request):
    context = {}

    if request.method == "POST":
        print(request.POST)
        form = UserProfileForm(request.POST, request.FILES)
        if form.is_valid():
            img = form.cleaned_data.get("avatar")
            obj, created = Profile.objects.update_or_create(
                username=form.cleaned_data.get('username'),
                defaults={'avatar': img},
            )
            obj.save()
            print(obj)
            return redirect('home')

    else:
        form = UserProfileForm()
    context['form']= form
    return render(request, "home.html", context)

urls.py

from django.urls import path
from pages.views import index

urlpatterns = [
    path('', index, name='home'), 
]

models.py

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

class Profile(AbstractUser):
    
    avatar = models.ImageField(default='default.png', upload_to='',null=True, blank=True )

forms.py

from django import forms
from django.core.files.images import get_image_dimensions

from pages.models import Profile

class UserProfileForm(forms.ModelForm):
    class Meta:
        model = Profile
        fields = ('avatar',)

【问题讨论】:

  • 你能检查一下你的username是否是从前端发送的。
  • 什么意思?
  • NOT NULL constraint failed: pages_profile.username 表示您正在尝试发送空值。
  • 我该如何检查?
  • 你不用检查,它告诉你用户名是空的。您可以打印form.cleaned_data 以查看实际收到的内容。

标签: django heroku


【解决方案1】:
from django.shortcuts import redirect, render
from .forms import UserProfileForm
from .models import Profile

def index(request):
    context = {}
    if request.method == "POST":
        print(request.POST)
        form = UserProfileForm(request.POST or None, request.FILES or None,instance=request.user)
        if form.is_valid():
            """ 
            img = form.cleaned_data.get("avatar")
            print(img)
            print(form.cleaned_data.get('username'))
            print(request.user)
            obj, created = Profile.objects.update_or_create(
                username=form.cleaned_data.get('username'),
                defaults={'avatar': img},
            )
            obj.save()
            print(obj)
            """
            form.save()
            return redirect('home') 
    else:
        form = UserProfileForm(instance=request.user)
    context['form']= form
    return render(request, "home.html", context)

我把它换成了这个,它可以正常工作,但它还没有删除 s3 存储桶中的旧照片。需要的是 instance=request.user。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-13
    • 2013-09-22
    • 2021-09-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多