首页 > 解决方案 > 如何在我的个人字段中自动为用户设置外键集

问题描述

这是我的意见.py

@login_required(login_url='/login')
def user_edit(request, user_id):

    if request.method == 'POST':
        user = User.objects.get(id=user_id)

        form = ProfileForm(request.POST or None, instance=user)

        if form.is_valid():
            i = form.save(commit=False)
            i.user = request.user
            i.save()
            return redirect('list')
        else:
            form = ProfileForm()
        return render(request, "home/intro.html", {'form': form})

    else:
        return render(request, "home/intro.html")

这是我的forms.py

from django import forms
from django.forms import ModelForm
from .models import Profile


class ProfileForm(forms.ModelForm):
    class Meta:
        model = Profile
        fields = '__all__'

这是我的models.py

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


class Profile(models.Model):
    img = models.ImageField(upload_to='imgs/')
    about = models.TextField(max_length=255, null=False)
    phnum = models.IntegerField()
    uname = models.CharField(max_length=255, null=False)
    person = models.ForeignKey(User, on_delete=models.CASCADE, null=True)

    def __str__(self):
        return self.about

如何将人员设置为当前登录的用户 ID...???我想将用户 ID 保存到该外键,这样如果我删除用户,那么该用户的个人资料也将被删除

网址.py

from django.urls import path
from . import views
from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    path('', views.home, name="home"),
    path('signup/', views.user_crete, name="signup"),
    path('login/', views.user_login, name="login"),
    path('logout/', views.user_logout, name="logout"),
    path('edit/', views.user_edit, name="edit"),
    path('list/', views.user_list, name="list"),
]+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

模板

{% extends 'base.html' %}

{% block content %}

<h2 class="text-center mt-2">Setup Your Profile</h2>
<div class="col-md-6 offset-md-3">

<form class="mt-2" method="post" action="{% url 'edit' %}" enctype="multipart/form-data">{% csrf_token %}
  <div class="form-group">
    <label>Uname</label><br>
    <input type="text" class="form-control" placeholder="{{ user.username }}" name="uname" value="{{ user.username }}" readonly>
  </div>

  <div class="form-group">
    <label>Profile Picture</label><br>
    <input type="file" name="img">
  </div>
  <div class="form-group">
    <label>About Your Self</label><br>
    <input type="textbox" class="form-control" placeholder="Write about yourself" name="about">
  </div>
  <div class="form-group">
    <label>Phone Number</label><br>
    <input type="number" class="form-control" placeholder="Enter your Number" name="phnum">
  </div>



  <center><button type="submit" class="btn btn-primary">Edit</button></center>
</form>
</div>


{% endblock %}

我从创建特定用户个人资料的地方添加了我的模板,我还为更多大陆添加了 urls.py 文件

标签: pythondjangoforeign-keys

解决方案


在您的模型中,person是 User 的字段,但您编写的视图i.user应该编写i.person

@login_required(login_url='/login')
def user_edit(request, user_id):

    if request.method == 'POST':
        user = User.objects.get(id=user_id)

        form = ProfileForm(request.POST or None, instance=user)

        if form.is_valid():
            i = form.save(commit=False)
            i.person = request.user  # change here
            i.save()
            return redirect('list')
        else:
            form = ProfileForm()
        return render(request, "home/intro.html", {'form': form})

    else:
        return render(request, "home/intro.html")

urls.py 在你的 url 中传递用户 ID

path('edit/<int:user_id>/', views.user_edit, name="edit"),

模板 传递user.id给表单动作

<form class="mt-2" method="post" action="{% url 'edit' user.id %}" enctype="multipart/form-data">
   {% csrf_token %}
   ...

推荐阅读