首页 > 解决方案 > (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

你能告诉我解决这个问题的方法吗?谢谢!

标签: pythondjangoforms

解决方案


推荐阅读