Python Django视图重定向NoReverseMatch错误

Python Django视图重定向NoReverseMatch错误,python,django,Python,Django,在Django项目中,我在表单保存后出现错误NoReverseMatch,重定向到“父视图” models.py 这是一个模型代码-人员 class Personnel(models.Model): ID_Personnel = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) NameFirst = models.CharField(max_length=50) NameLast

在Django项目中,我在表单保存后出现错误NoReverseMatch,重定向到“父视图”

models.py

这是一个模型代码-人员

class Personnel(models.Model):
    ID_Personnel = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    NameFirst = models.CharField(max_length=50)
    NameLast = models.CharField(max_length=50)
    IsActive = models.BooleanField(default=True, editable=True)
    TimeCreation = models.DateTimeField(default=datetime.now, editable=False)

class IdentityDocument(models.Model):
    ID_IdentityDocument = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    ID_Personnel = models.ForeignKey(Personnel, on_delete=models.PROTECT)
    NumberSerial = models.CharField(max_length=50)
    DateIssue = models.DateField(null=True)
    DateExpiration = models.DateField(null=True)
    NameIssuer = models.CharField(max_length=100, null=True)
    IsActive = models.BooleanField(default=True, editable=True)
    TimeCreation = models.DateTimeField(default=datetime.now, editable=False)
def personnel_edit(request, pk):
    person = get_object_or_404(Personnel, ID_Personnel=pk)
    if request.method == 'POST':
        form = PersonnelForm(request.POST, instance=person)
        if form.is_valid():
            person = form.save(commit=False)
            person.save()
            return redirect('personnel_detail', pk=person.ID_Personnel)
    else:
        form = PersonnelForm(instance=person)
    return render(request, 'personnel/personnel_edit.html', {'form': form})

def personnel_detail(request, pk):
    person = get_object_or_404(Personnel, ID_Personnel=pk)
    try:
        document = IdentityDocument.objects.filter(ID_Personnel=pk).order_by('ID_IdType', '-DateExpiration').distinct(
            'ID_IdType')
    except IdentityDocument.DoesNotExist:
        document = None
    return render(request, 'personnel/personnel_detail.html',
                  {'person': person, 'document': document})
views.py-人事

class Personnel(models.Model):
    ID_Personnel = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    NameFirst = models.CharField(max_length=50)
    NameLast = models.CharField(max_length=50)
    IsActive = models.BooleanField(default=True, editable=True)
    TimeCreation = models.DateTimeField(default=datetime.now, editable=False)

class IdentityDocument(models.Model):
    ID_IdentityDocument = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    ID_Personnel = models.ForeignKey(Personnel, on_delete=models.PROTECT)
    NumberSerial = models.CharField(max_length=50)
    DateIssue = models.DateField(null=True)
    DateExpiration = models.DateField(null=True)
    NameIssuer = models.CharField(max_length=100, null=True)
    IsActive = models.BooleanField(default=True, editable=True)
    TimeCreation = models.DateTimeField(default=datetime.now, editable=False)
def personnel_edit(request, pk):
    person = get_object_or_404(Personnel, ID_Personnel=pk)
    if request.method == 'POST':
        form = PersonnelForm(request.POST, instance=person)
        if form.is_valid():
            person = form.save(commit=False)
            person.save()
            return redirect('personnel_detail', pk=person.ID_Personnel)
    else:
        form = PersonnelForm(instance=person)
    return render(request, 'personnel/personnel_edit.html', {'form': form})

def personnel_detail(request, pk):
    person = get_object_or_404(Personnel, ID_Personnel=pk)
    try:
        document = IdentityDocument.objects.filter(ID_Personnel=pk).order_by('ID_IdType', '-DateExpiration').distinct(
            'ID_IdType')
    except IdentityDocument.DoesNotExist:
        document = None
    return render(request, 'personnel/personnel_detail.html',
                  {'person': person, 'document': document})
views.py-在表单中设置ID_人员

def identitydocument_new(request, fkey):
    if request.method == 'POST':
        form = IdentityDocumentForm(request.POST)
        if form.is_valid():
            iddoc = form.save(commit=False)
            iddoc.ID_Personnel = Personnel.objects.get(ID_Personnel=fkey)
            iddoc.save()
            return redirect('personnel_detail', pk=fkey)
    else:
        form = IdentityDocumentForm()
    return render(request, 'personnel/identitydocument_edit.html', {'form': form})
def identitydocument_edit(request, pk):
    doc = get_object_or_404(IdentityDocument, ID_IdentityDocument=pk)
    if request.method == 'POST':
        form = IdentityDocumentForm(request.POST, instance=doc)
        if form.is_valid():
            doc = form.save(commit=False)
            doc.save()
            return redirect('personnel_detail', pk=doc.ID_Personnel)
    else:
        form = IdentityDocumentForm(instance=doc)
    return render(request, 'personnel/identitydocument_edit.html', {'form': form})
url.py

from django.urls import path
from . import views

urlpatterns = [
    path('', views.personnel_list, name='personnel_list'),
    path('personnel/<uuid:pk>/', views.personnel_detail, name='personnel_detail'),
    path('personnel/new', views.personnel_new, name='personnel_new'),
    path('personnel/<uuid:pk>/edit/', views.personnel_edit, name='personnel_edit'),
    path('personnel/identitydoc/<uuid:fkey>/', views.identitydocument_new, name='identitydocument_new'),
    path('personnel/identitydoc/<uuid:pk>/edit/', views.identitydocument_edit, name='identitydocument_edit'),
]
从django.url导入路径
从…起导入视图
URL模式=[
路径(“”,views.personal\u list,name='personal\u list'),
路径('personal/',views.personal\u detail,name='personal\u detail'),
路径('personal/new',views.personal\u new,name='personal\u new'),
路径('personal//edit/',views.personal\u edit,name='personal\u edit'),
路径('personal/identitydocument/',views.identitydocument_new,name='identitydocument_new'),
路径('personal/identitydoc//edit/',views.identitydocument_edit,name='identitydocument_edit'),
]
表单创建新文档并保存,但编辑后不会出现EverSematch错误

试试这个

from django.urls import reverse

redirect(reverse('personnel_detail', kwargs={'pk': doc.ID_Personnel}))
试试这个

from django.urls import reverse

redirect(reverse('personnel_detail', kwargs={'pk': doc.ID_Personnel}))

如该错误所示,
ID_personal
是对整个相关人员文档的引用。URL需要该对象的ID。所以你应该:

return redirect('personnel_detail', pk=doc.ID_Personnel_id)

但从根本上说,这表明您的字段名不正确。正如我所说,这是对对象的引用,而不是ID,因此它不应该有一个暗示它是ID的名称。只需称它为
personal
。(另外,Python风格是使用带有下划线的
小写字母作为属性,所以实际上应该是
人员

如错误所示,
ID\u personal
是对整个相关人员文档的引用。URL需要该对象的ID。所以你应该:

return redirect('personnel_detail', pk=doc.ID_Personnel_id)

但从根本上说,这表明您的字段名不正确。正如我所说,这是对对象的引用,而不是ID,因此它不应该有一个暗示它是ID的名称。只需称它为
personal
。(同样,Python风格是使用带有下划线的
小写字母作为属性,所以实际上应该是
人员

文档Id\u人员
吗?你能分享你的模型的相关部分吗?请展示完整的回溯。您如何设置该标识文档中的
ID_人员
字段?添加了回溯和查看新文档是
doc.ID_人员
a
uuid
?你能分享你的模型的相关部分吗?请展示完整的回溯。您如何设置该标识文档中的
ID_personal
字段?添加了回溯和查看新文档谢谢,但为什么我在编辑personal时它会起作用。添加视图是因为您使用的是传递到视图中的ID,而不是FK字段。谢谢,但为什么我在编辑人员时它会起作用。添加视图是因为您使用传递到视图中的ID,而不是FK字段。