【问题标题】:I'm missing something editing database record with Django and Python我缺少使用 Django 和 Python 编辑数据库记录的内容
【发布时间】:2019-07-30 13:28:52
【问题描述】:

我是 Django 和 Python 的新手,我希望能够使用模型表单编辑数据库记录。这很令人沮丧,因为我知道我错过了一些显而易见的事情,但我花了几个小时试图弄清楚它是什么。我看过一些帖子,它们给了我一个想法,但我在阅读中遗漏了一些东西。

我正在运行 Windows 10 桌面版,python 3.7。与我正在尝试做的最接近的帖子是这个,但我仍然缺少一些东西。 how to edit model data using django forms(推荐答案中的XXX应该是什么样子)

我在 my_get_name 中尝试了各种 pk 组合,但均未成功。

感谢您为自己提供的任何帮助和指导。

我得到的错误是:

NameError at /proj1/employees/update/EMP0001
name 'EmpID' is not defined
Request Method: GET
Request URL:    http://localhost:8000/proj1/employees/update/EMP0001
Django Version: 2.2.1
Exception Type: NameError
Exception Value:    
name 'EmpID' is not defined

错误发生在我定义 my_instance 的 views.py 中

views.py

from .models import emp_table
from .forms import EmpDetailForm

def my_get_name(request, pk):
    #  error occurs on the next line
    my_instance = emp_table.objects.get(id=EmpID)

    if request.method == 'POST':

        form = EmpDetailForm(request.POST, instance=my_instance)

        if form.is_valid():
            # process the data
            # ...
            # redirect to a new URL:
            return HttpResponseRedirect('/#thanks/')
    else:
        form = EmpDetailForm(instance=my_instance)

    return render(request, 'proj1/emp-detail-form.html', {'form': form}, request.EmpID,)

forms.py

from django import forms
from .models import emp_table

class EmpDetailForm(forms.ModelForm):
    class Meta:
        model = emp_table
        fields = ('EmpID', 'EmpLastName', 'EmpFirstName',)

urls.py

from django.urls import path

from . import views
from . import forms

app_name = 'proj1'

urlpatterns = [
    path('', views.mainmenu, name='mainmenu'),
    path('employees/update/<str:pk>', views.my_get_name, name='emp-detail-form'),
]

models.py

class emp_table(models.Model):
    Default_EmpDeptID = 'ZZZ999'
    Default_EmpEmail = 'smith@example.com'
    Default_EmpLastName = 'ZZZZZZ'
    Default_EmpFirstName = 'AAAAAA'
    Default_EmpNumber = '1234567890'
    Default_EmpID = '1234567890'
    Default_EmpOrgID = '1234567890'

    EmpID = models.CharField(max_length=45, primary_key=True, default=Default_EmpID)
    EmpNumber = models.CharField(max_length=20, default=Default_EmpNumber)
    EmpFirstName = models.CharField(max_length=20, help_text='Enter first name',
                                  default=Default_EmpFirstName, verbose_name='First Name')
    EmpLastName = models.CharField(max_length=20, help_text='Enter last name',
                                  default=Default_EmpLastName, verbose_name='Last Name')
    EmpEmail = models.EmailField(max_length=60, help_text='eg. mary@example.com',
                                  default=Default_EmpEmail)
    EmpDeptID = models.ForeignKey(dept_table, on_delete=models.CASCADE,
                                  default=Default_EmpDeptID)
    EmpOrgID = models.CharField(max_length=20, default=Default_EmpOrgID)

    return_value = EmpLastName, EmpFirstName
    def __str__(self):
        return self.EmpLastName

emp-detail-form.html

{% block content %}
<div class='content'>
<h1>Update Employee Details</h1>

<form action="/proj1/employees/update/{{ object.EmpID }}/" method="POST">
    {% csrf_token %}
    {{ form.as_ul }}
    <input type="submit" value="Submit">
</form>

</div>
{% endblock %}

我要做的是从表中读取一个字段,对其进行编辑,然后将编辑后的字段写回数据库。由于我的问题 atm 一直在将一个字段读入一个表单以准备编辑它,所以我还没有完成写作部分。

【问题讨论】:

  • 您的views.py 中没有变量EmpID。你所拥有的是pk
  • my_instance = emp_table.objects.get(id=pk)

标签: python django


【解决方案1】:

您没有对EmpID 的任何引用,但您在pk 中有实例的主键。使用pk获取记录

from .models import emp_table
from .forms import EmpDetailForm

def my_get_name(request, pk):
    #  error occurs on the next line
    my_instance = emp_table.objects.get(pk=pk)

    if request.method == 'POST':

        form = EmpDetailForm(request.POST, instance=my_instance)

        if form.is_valid():
            # process the data
            # ...
            # redirect to a new URL:
            return HttpResponseRedirect('/#thanks/')
    else:
        form = EmpDetailForm(instance=my_instance)

    return render(request, 'proj1/emp-detail-form.html', {'form': form}, pk)

【讨论】:

  • 还是不行;为什么render 有第四个参数?
  • 另外,一开始查询是错误的;关键是 pk 由于某种原因被称为 EmpID。你需要my_instance = emp_table.objects.get(pk=pk)my_instance = emp_table.objects.get(EmpID=pk)
  • 谢谢大家。我遵循 Higor 和 Ajay 的建议 return render(request, 'proj1/emp-detail-form.html', {'form': form}, pk) 然后 Daniel 的 my_instance = emp_table.objects.get(pk=pk) 和它一切正常。再次感谢您。
猜你喜欢
  • 2020-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-20
  • 1970-01-01
  • 2012-06-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多