Django-用户创建但配置文件丢失

问题描述

注册新用户时,可以从“管理”页面中看到该用户已创建。 但是,每当我在导航栏中进入个人资料页面时,都会出现以下错误。

enter image description here

enter image description here

在我在“个人资料”页面上添加功能(删除用户和个人资料的按钮)之前,它实际上是可行的,但我看不到需要页面来解决此错误。

profile.html

{% extends "digitalFarm/base.html" %}
{% load crispy_forms_tags %}

{% block content %}
      <div class="content-section">
             <div class="media">
                    <img class="rounded-circle account-img" src="{{ user.profile.image.url }}">
                    <div class="media-body">
                           <h2 class="account-heading">{{ user.username }}</h2>
                           <p class="text-secondary">{{ user.email }}</p>
                    </div>
             </div>
          <form method="POST" enctype="multipart/form-data">
              {% csrf_token %}
              <fieldset class="form-group">
                  <legend class="boder-bottom mb-4">Profile info</legend>
                  {{ u_form|crispy }}
                  {{ p_form|crispy }}
                  {{ d_form|crispy }}
              </fieldset>
              <div class="form-group">
                  <button class="btn btn-outline-info" type="submit">Update Profile</button>
              </div>
          </form>

          <form>
              {% csrf_token %}
              <fieldset class="form-group">
                  <legend class="border-bottom mb-4">Delete User Account</legend>
              </fieldset>
              <div class="form-group">
                  <button class="btn btn-danger">
                      <a style="color: white" href="{% url 'profile_confirm_delete' %}">Delete Account</a></button>
              </div>
          </form>
      </div>
{% endblock content %}

views.py

    def register(request):
    if request.method == 'POST':
        form = UserRegisterForm(request.POST)
        if form.is_valid():
            form.save()
            username = form.cleaned_data.get('username')
            messages.success(request,f'Your account has been created! You are now able to login')
            return redirect('login')
    else:
        form = UserRegisterForm()
    return render(request,'users/register.html',{'form': form})

def profile_confirm_delete(request):
    user = request.user
    context = {
        'user': user
    }
    return render(request,'users/profile_confirm_delete.html',context)

@login_required
def profile(request):
    if request.method == 'DELETE':
        print('delete works')
        return redirect('digitalFarm-home')

    if request.method == 'POST':
        u_form = UserUpdateForm(request.POST,instance=request.user)
        p_form = ProfileUpdateForm(request.POST,request.FILES,instance=request.user.profile)

        if u_form.is_valid() and p_form. is_valid():
            u_form.save()
            p_form.save()
            messages.success(request,f'Your account has been updated!')
            return redirect('profile')
    else :
        u_form = UserUpdateForm(instance=request.user)
        p_form = ProfileUpdateForm(instance=request.user.profile)

    context = {
        'u_form' : u_form,'p_form' : p_form
    }
    return render(request,'users/profile.html',context)

signals.py

@receiver(post_save,sender=User)
def create_profile(sender,instance,created,**kwargs):
    print("INSIDE CREATE_PROFILE")#negative
    if created:
        print("INSIDE CREATED_PROFILE")#negative
        Profile.objects.create(user=instance)

@receiver(post_save,sender=User)
def save_profile(sender,**kwargs): #kwargs= accepts any additional keywords
        instance.profile.save()

@receiver(pre_delete,sender=User)
def delete_profile(sender,**kwargs): #kwargs= accepts any additional keywords
        instance.profile.delete()

forms.py

class UserRegisterForm(UserCreationForm):
    email = forms.EmailField()

    class Meta:
        model = User
        fields = ['username','email','password1','password2']

#Update
class UserUpdateForm(forms.ModelForm):
    email = forms.EmailField()

    class Meta:
        model = User
        fields = ['username','email']

class ProfileUpdateForm(forms.ModelForm):
    print("INSIDE ProfileUpdateForm")
    class Meta:
        model = Profile
        fields = ['image']

#Delete
class ProfileDeleteForm(forms.ModelForm):
    class Meta:
        model = Profile
        fields = ['image']

class UserDeleteForm(forms.ModelForm):
    class Meta:
        model = User
        fields = []   #Form has only submit button.  Empty "fields" list still necessary,though.

解决方法

在signals.py中,我没有看到任何save()指令,您的配置文件实例应该如何进入数据库,数据库配置文件表为空。您需要这样的东西(用于创建):

Profile.objects.create(user=instance).save()

或实际上

profileInstance = Profile.objects.create(user=instance)
profileInstance.initNewProfile() # setup context default values
profileInstance.save()

此外,在删除时,实际上还有一个更好的选项来删除从属实例:ORM级别的CASCADE。必须在类(models.py)中定义

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...