(Django) Редактирование данных формы, не являющейся ModelForm
В настоящее время у меня есть модель Form (к сожалению, не ModelForm) с данными, которые необходимо редактировать/обновлять. После просмотра многих постов (большинство из которых были связаны с ModelForm), я нашел способ редактировать/обновлять данные формы внутри оболочки Django со следующим синтаксисом:
Drug.objects.filter(drug_id='d61').update(drug_id='d7')
Это сработало внутри оболочки, но когда я сделал то же самое в html-форме, ничего не произошло: данные остались неизменными, ошибка не возникла.
drugs/forms.py
from django import forms
class DrugForm(forms.Form):
drug_id = forms.CharField(widget=forms.TextInput(attrs={
'class': 'form-control',
'id': 'drug_id',
'data-val': 'true',
'data-val-required': 'Please enter drug id',
}))
name = forms.CharField(widget=forms.TextInput(attrs={
'class': 'form-control',
'id': 'name',
'data-val': 'true',
'data-val-required': 'Please enter name',
}))
updated_date = forms.CharField(widget=forms.DateInput(attrs={
'class': 'form-control',
'type': 'date',
'id': 'update_date',
}), required=False)
drugs/models.py
from django.db import models
class Drug(models.Model):
drug_id = models.CharField(max_length=20, unique=True, error_messages={'unique':"This drug id has already been registered."})
name = models.CharField(max_length=50)
updated_date = models.DateField(auto_now_add=True, blank=True, null=True)
def __str__(self):
return self.name
drugs/views.py
from django.shortcuts import render, redirect
from django.views.generic import ListView
from django.shortcuts import get_object_or_404
from .models import (
Drug,
)
def update(request, drug_id):
drug = get_object_or_404(Drug, drug_id=drug_id)
drug_id = drug.drug_id
name = drug.name
updated_date = drug.updated_date
if updated_date == '':
updated_date = None
Drug.objects.filter(drug_id=drug_id).update(drug_id=drug_id, name=name, updated_date=updated_date)
return redirect("drug-list")
templates/drugs/edit_drug.html
{% extends 'base/base.html' %}
{% block title %}Edit Drug{% endblock title %}
{% block content %}
<div class="row">
<div class="col-lg-12">
<div class="card">
<div class="card-header">
<strong class="card-title">Edit Drug</strong>
</div>
<div class="card-body">
<!-- Credit Card -->
<div id="pay-invoice">
<div class="card-body">
<form action="/update/{{drug.drug_id}}/" method="POST" novalidate="novalidate">
{% csrf_token %}
<div class="form-group">
<label for="drug_id" class="control-label mb-1">Drug ID</label>
<input type="text" class="form-control" name="drug_id" id="drug_id" value="{{ drug.drug_id }}"/>
</div>
<div class="form-group">
<label for="name" class="control-label mb-1">Name</label>
<input type="text" class="form-control" name="name" id="name" value="{{ drug.name }}"/>
</div>
<label for="updated_date" class="control-label mb-1">Updated Date</label>
<input type="date" class="form-control" name="updated_date" id="updated_date" value="{{ drug.updated_date }}"/>
</div>
<div>
<button id="payment-button" type="submit" class="btn btn-lg btn-info btn-block">
<span id="payment-button-amount">SUBMIT</span>
</button>
</div>
<div class="form-errors">{{form.errors}}</div>
</form>
</div>
</div>
</div>
</div> <!-- .card -->
</div><!--/.col-->
</div>
{% endblock content %}
ddms/urls.py
from django.contrib import admin
from django.urls import path, include
# local
from .views import dashboard
from drugs.views import edit, update, DrugListView
urlpatterns = [
path('admin/', admin.site.urls),
path('', dashboard, name='dashboard'),
path('drug-list/', DrugListView.as_view(), name='drug-list'),
path('drugs/', include('drugs.urls')),
path('update/<drug_id>/', update),
path('edit/<drug_id>/', edit),
]
Я думаю, что проблема может быть внутри формы шаблона edit_drug.html. Я попробовал form.errors, но ничего не отображается. Следующее, что я предполагаю, это, вероятно, views.py, но тот же синтаксис работал в оболочке Django. Я попытался сохранить объект Drug после обновления, но он сказал, что объект int не может быть сохранен!
d = Drug.objects.filter(drug_id='d61').update(drug_id='d7')
d.save() # failed
Не могли бы вы показать мне способ решения этой проблемы? Спасибо!