python - (Django) 编辑不是 ModelForm 的表单数据
问题描述
目前我有一个表单模型(不幸的是不是 ModelForm),其中包含需要编辑/更新的数据。在浏览了许多帖子(其中大部分与 ModelForm 相关)后,我找到了一种在 Django shell 中编辑/更新 Form 数据的方法,语法如下:
Drug.objects.filter(drug_id='d61').update(drug_id='d7')
它在 shell 内部工作,但是当我在 html 表单中做同样的事情时,什么也没发生:数据保持不变,没有引发错误。
药物/表格.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)
药物/模型.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
药物/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 edit(request, drug_id):
drug = get_object_or_404(Drug, drug_id=drug_id)
context = {
'drug': drug
}
return render(request, 'drugs/edit_drug.html', context)
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")
模板/药物/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 shell 中也有效。我尝试在更新后保存 Drug 对象,但它说 int 对象无法保存!
d = Drug.objects.filter(drug_id='d61').update(drug_id='d7')
d.save() # failed
你能告诉我解决这个问题的方法吗?谢谢!
解决方案
推荐阅读
- java - Apache Storm 拓扑上的 Sigar UnsatisfiedLinkError
- python - 登录后重定向到评论部分在 django 中不起作用
- azure - 如何在 Service Fabric 中设置 Cloud_RoleName
- azure-functions - 功能应用程序在每周六 01:00 运行
- android - Android BiometricPrompt 在运行 Android Pie 的三星上显示虹膜扫描仪
- elasticsearch - Kibana 在选择时间戳和收到_at 时未显示正确的数据
- typescript - 打字稿中管理模型实例化和创建的最佳方法是什么?
- oracle - 是否有 Oracle API 可以在结构化的字节序列上实现只读视图
- java - 如何将代码/描述扩展到复杂对象?
- http - SSL 的域仅在一个 Google 帐户上显示“不安全”