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