I';我在用Django和Python编辑数据库记录时丢失了一些东西

I';我在用Django和Python编辑数据库记录时丢失了一些东西,python,django,Python,Django,我是Django和Python新手,我希望能够使用模型表单编辑数据库记录。这是令人沮丧的,因为我知道我错过了一些显而易见的东西,但我花了几个小时试图弄清楚这是什么。我看过一些帖子,他们给了我一个想法,但我在阅读中遗漏了一些东西 我正在运行Windows10桌面,Python3.7。最接近我想做的是这篇文章,但我还是遗漏了一些东西。 (推荐答案中的XXX应该是什么样子) 我在我的名字中尝试了各种pk组合,但没有成功 我感谢你们对我的帮助和指导 我得到的错误是: NameError at /proj

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

我正在运行Windows10桌面,Python3.7。最接近我想做的是这篇文章,但我还是遗漏了一些东西。 (推荐答案中的XXX应该是什么样子)

我在我的名字中尝试了各种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
错误发生在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,)
from django import forms
from .models import emp_table

class EmpDetailForm(forms.ModelForm):
    class Meta:
        model = emp_table
        fields = ('EmpID', 'EmpLastName', 'EmpFirstName',)
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'),
]
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
forms.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,)
from django import forms
from .models import emp_table

class EmpDetailForm(forms.ModelForm):
    class Meta:
        model = emp_table
        fields = ('EmpID', 'EmpLastName', 'EmpFirstName',)
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'),
]
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
url.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,)
from django import forms
from .models import emp_table

class EmpDetailForm(forms.ModelForm):
    class Meta:
        model = emp_table
        fields = ('EmpID', 'EmpLastName', 'EmpFirstName',)
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'),
]
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详细信息表单.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 %}
{%block content%}
更新员工详细信息
{%csrf_令牌%}
{{form.as_ul}}
{%endblock%}

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

您没有任何对
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)

您没有对
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)

视图.py中没有变量
EmpID
。您拥有的是
pk
my_instance=emp\u table.objects.get(id=pk)您的
views.py中没有变量
EmpID
。您所拥有的是
pk
my_instance=emp\u table.objects.get(id=pk)仍然无法工作;为什么有第四个参数来渲染
;关键是,出于某种原因,pk被称为EmpID。您需要
my\u instance=emp\u table.objects.get(pk=pk)
my\u instance=emp\u table.objects.get(EmpID=pk)
谢谢大家。我遵循了Higor和Ajay的建议返回render(请求'proj1/emp detail form.html',{'form':form},pk),然后是Daniel的my_instance=emp_table.objects.get(pk=pk),一切正常。再次谢谢你,还是不行;为什么有第四个参数来渲染
;关键是,出于某种原因,pk被称为EmpID。您需要
my\u instance=emp\u table.objects.get(pk=pk)
my\u instance=emp\u table.objects.get(EmpID=pk)
谢谢大家。我遵循了Higor和Ajay的建议返回render(请求'proj1/emp detail form.html',{'form':form},pk),然后是Daniel的my_instance=emp_table.objects.get(pk=pk),一切正常。再次感谢你。