在 Django 中使用 id 预填充表单数据?

Pre filled form data using id in Django?

实际上一切正常,Id 也进入了 URL 但是当我点击更新按钮时数据没有进入字段 这是我的代码

这是我创建的模型

#Models.py
from django.db import models

class User(models.Model):
    first_name = models.CharField(max_length=100)
    last_name = models.CharField(max_length=100)
    mobile_number = models.IntegerField()
    cnic = models.CharField(max_length = 13)
    blood_group = models.CharField(max_length= 10)
    last_donation = models.DateTimeField(auto_now_add=True)

这是我的观点

#views.py
from django.shortcuts import render,redirect
from .models import *
from .forms import UserForm
from django.urls import reverse



def home(request):
    data = User.objects.all()  #This function display All data on homePage
    context = {
        'data': data
    }
    return render(request, 'home.html',context)
    
def donor(request):
    if request.method == "POST":
        userform = UserForm(request.POST)   #This Add New User
        if userform.is_valid():
            userform.save()
    else:
        userform = UserForm()
    return render(request, 'donor.html',{'userform':userform,})

def Update(request,pk):
    context = {}
    if request.method == "POST":
        p_id = User.objects.get(pk = pk)
        form = UserForm(request.POST or None, instance= p_id)
        if form.is_valid():
            form.save()
            return redirect(reverse('home'))
    context['form'] = UserForm()
    return render(request, 'update.html',context)

这是我的URLS

#urls.py

from django.urls import  path
from blood import views

urlpatterns = [
    path('',views.home, name='home'),
    path('donor/', views.donor, name = 'donor'),
    path('update/<int:pk>', views.Update, name='update'),
]

这是我创建并检查验证的表单

#forms.py
from django.forms import ModelForm
from .models import  User
from datetime import  timedelta
from django.utils.timezone import datetime
from django.core.exceptions import ValidationError


class UserForm(ModelForm):
    class Meta:
        model = User
        fields = "__all__"
    

    def clean_cnic(self):
        cnic = self.cleaned_data['cnic']
        if not User.objects.filter(cnic=cnic).exists():
            return cnic 
        try:
            u_obj = User.objects.get(cnic = cnic)
        except User.DoesNotExist:
            raise ValidationError("User Does not exist")
        if u_obj:
            previous_date = u_obj.last_donation
            current_date = datetime.now().astimezone()
            final = current_date - previous_date
            print(final)
            if final < timedelta(days = 90):
                raise ValidationError("U have to wait 90 days to complete")  
            return cnic 


    def clean_blood_group(self):
        cnic = self.cleaned_data.get("cnic")
        blood_group = self.cleaned_data['blood_group']
        if not User.objects.filter(cnic = cnic).exists():
            return blood_group
        obj = User.objects.get(cnic = cnic)
        if obj.blood_group == blood_group:
            return blood_group    
        raise ValidationError("Blood group does not match")

这是 HTML 与更新功能一起使用的代码

#update.html
{% extends 'base.html' %}


{% block title %}
  update      
{% endblock %}


{% block body %}
<div class = 'container mt-5 pt-6'>
  <div class = 'col-md-5 mx-auto'> 
    <h3>This is update Page</h3>
      <form method = "POST" action="">
        {% csrf_token %}
          {{ form.non_field_errors }}
          <div class="mb-3">
            {{ form.cnic.errors }}
              <label  class="form-label">Enter CNIC</label>
              <input type="text" class="form-control" name = "cnic" >
              {{cnic}}
          </div>
              <div class="mb-3">
                <label class="form-label">First Name</label>
                <input type="text" class="form-control" name = 'first_name'>
                {{first_name}}
              </div>
              <div class="mb-3">
                <label  class="form-label">Last Name</label>
                <input type="text" class="form-control" name = "last_name" >
                {{last_name}}
              </div>
              <div class="mb-3">
                  <label class="form-label">Mobile Number</label>
                  <input type="text" class="form-control" name = "mobile_number" >
                  {{mobile_number}}
                </div>
              <div class="mb-3">
                {{ form.blood_group.errors}}
                  <label  class="form-label">Blood Group</label>
                  <input type="text" class="form-control" name = "blood_group">
                  {{blood_group}}
              </div>
              <button type="submit" class="btn btn-primary" value="update">Submit</button>
      </form>
  </div>
</div>
{% endblock %}

一切正常。没有错误出现但无法正常工作。提前致谢

更新表单的更好方法是添加一个表单初始值来保存需要更新的字段数据。此外,您还在表单上下文变量上调用了表单对象(context['form'] = UserForm()),这使得它不保存数据

def Update(request,pk):
    context = {}
    if request.method == "POST":
        p_id = User.objects.get(pk = pk)
        form = UserForm(request.POST or None, instance=p_id)
        if form.is_valid():
            form.save()
            return redirect(reverse('home'))
    else:
        form = UserForm(
                initial={
                  'cnic':p_id.cnic
                 'first_name':p_di.first_name,
                 'last_name' :p_id.lasr_name,
                  'mobile_number':p_di.mobile_number,
                   'blood_group': p_di.blood_group,})

    context['form'] = form 
    return render(request, 'update.html',context)

下面介绍表单编辑中的数据如何更新

#update.html
{% extends 'base.html' %}


{% block title %}
  update      
{% endblock %}


{% block body %}
<div class = 'container mt-5 pt-6'>
  <div class = 'col-md-5 mx-auto'> 
    <h3>This is update Page</h3>
      <form method = "POST" action="">
        {% csrf_token %}
          {{ form.non_field_errors }}
          <div class="mb-3">
            {{ form.cnic.errors }}
              <label  class="form-label">Enter CNIC</label>
              <input type="text" class="form-control" name = "cnic" value="{{form.initial.cnic}}">
          </div>
              <div class="mb-3">
                <label class="form-label">First Name</label>
                <input type="text" class="form-control" name = 'first_name' value="{{form.initial.first_name}}">
                
              </div>
              <div class="mb-3">
                <label  class="form-label">Last Name</label>
                <input type="text" class="form-control" name = "last_name" value="{{form.initial.last_name}}" >
                
              </div>
              <div class="mb-3">
                  <label class="form-label">Mobile Number</label>
                  <input type="text" class="form-control" name = "mobile_number" value="{{form.initial.mobile_number}}" >
                </div>
              <div class="mb-3">
                {{ form.blood_group.errors}}
                  <label  class="form-label">Blood Group</label>
                  <input type="text" class="form-control" name ="blood_group" value="{{form.initial.blood_group}}">
              </div>
              <button type="submit" class="btn btn-primary" value="update">Submit</button>
      </form>
  </div>
</div>
{% endblock %}