Предварительное заполнение формы данными с использованием id в 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

#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 %}

Все работает нормально. Ошибок нет, но не работает должным образом. Заранее спасибо

Лучшим способом обновления формы является добавление формы initial для хранения данных поля, которое необходимо обновить. Также вы вызвали объект формы ( 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 %}
Вернуться на верх