我是Python的初学者。在这种情况下,我想要做的只是在更新数据后返回到个人资料的详细信息(index.html)。我收到了错误NoReverseMatch。
models.py
from django.contrib.auth.models import User
from modulos.administracao.models import *
from django.urls import reverse
class PessoaVinculada(models.Model):
class Meta:
ordering = ['nome']
verbose_name = 'Pessoa Vinculada á Unidade'
verbose_name_plural = 'Pessoas Vinculadas á Unidade'
user = models.OneToOneField(User, unique=True, related_name='pessoa_vinculada', on_delete=models.CASCADE)
nome = models.CharField(max_length=200, null=True, verbose_name='Nome completo')
apelido_em_uso = models.CharField(max_length=20, null=True, verbose_name='Apelido em uso')
genero = models.ForeignKey(Generos, null=True, verbose_name='Género', on_delete=models.SET_NULL)
acesso_a_aplicacao = models.BooleanField(default=True, verbose_name='Acesso à aplicação')
def __str__(self):
return '{}'.format(self.nome)
def get_success_url(self, **kwargs):
# obj = form.instance or self.object
return reverse("profile", kwargs={'pk': self.id})
def nim(self):
return '{}'.format(self.user.username)
def nome_apelido_em_uso(self):
if self.nome and self.apelido_em_uso:
n = self.nome.split()
return '{} {}'.format(n[0], self.apelido_em_uso)
else:
return '{}'.format(self.nome)
views.py
from django.http import HttpResponseRedirect
from django.shortcuts import get_object_or_404, render
from django.contrib.auth.decorators import login_required
from modulos.gestao.forms import *
@login_required(login_url="/login/")
def estado_maior_seccao_pessoal_pessoal_pessoas_vinculadas_dados_biograficos_elementos_gerais(request, pk=None):
context = {}
context['user'] = get_object_or_404(User, id=pk)
context['pessoa_vinculada'] = get_object_or_404(PessoaVinculada, user_id=pk)
context['pessoa_vinculada_identificacao'] = PessoaVinculadaIdentificacao.objects.filter(user_id=pk)
context['pessoa_vinculada_foto'] = PessoaVinculadaFoto.objects.filter(user_id=pk)
return render(request, 'gestao/estado_maior/seccao_pessoal/pessoal/pessoas_vinculadas/dados_biograficos/geral/index.html', context)
@login_required(login_url="/login/")
def estado_maior_seccao_pessoal_pessoal_pessoas_vinculadas_dados_biograficos_elementos_gerais_editar(request, pk=None):
user = get_object_or_404(User, id=pk)
pessoa_vinculada_identificacao = PessoaVinculadaIdentificacao.objects.filter(user_id=pk)
pessoa_vinculada_foto = PessoaVinculadaFoto.objects.filter(user_id=pk)
pessoa_vinculada = get_object_or_404(PessoaVinculada, id=pk)
if request.method == 'POST':
user_form = PessoaVinculadaForm(request.POST, instance=pessoa_vinculada)
if user_form.is_valid():
user_form.save()
return HttpResponseRedirect(reverse("estado_maior_seccao_pessoal_pessoal_pessoas_vinculadas_dados_biograficos_elementos_gerais"))
else:
context = {
'user': user,
'pessoa_vinculada_identificacao': pessoa_vinculada_identificacao,
'pessoa_vinculada_foto': pessoa_vinculada_foto,
'pessoa_vinculada': pessoa_vinculada,
'user_form': user_form,
}
return render(request, 'gestao/estado_maior/seccao_pessoal/pessoal/pessoas_vinculadas/dados_biograficos/geral/editar.html', context)
else:
user_form = PessoaVinculadaForm(instance=pessoa_vinculada)
context = {
'user': user,
'pessoa_vinculada_identificacao': pessoa_vinculada_identificacao,
'pessoa_vinculada_foto': pessoa_vinculada_foto,
'pessoa_vinculada': pessoa_vinculada,
'user_form': user_form,
}
return render(request, 'gestao/estado_maior/seccao_pessoal/pessoal/pessoas_vinculadas/dados_biograficos/geral/editar.html', context)
forms.py
从Django导入表格 从modulos.pessoas.vinculadas.models导入*
class PessoaVinculadaForm(forms.ModelForm):
class Meta:
model = PessoaVinculada
fields = [
'user',
'nome',
'apelido_em_uso',
'genero',
'acesso_a_aplicacao',
]
urls.py
from modulos.gestao import views
from django.urls import path
urlpatterns = [
path('estado_maior/seccao_pessoal/pessoal/pessoas_vinculadas/dados_biograficos/<int:pk>/geral/', views.estado_maior_seccao_pessoal_pessoal_pessoas_vinculadas_dados_biograficos_elementos_gerais, name='estado_maior_seccao_pessoal_pessoal_pessoas_vinculadas_dados_biograficos_elementos_gerais'),
path('estado_maior/seccao_pessoal/pessoal/pessoas_vinculadas/dados_biograficos/geral/<int:pk>/editar/', views.estado_maior_seccao_pessoal_pessoal_pessoas_vinculadas_dados_biograficos_elementos_gerais_editar, name='estado_maior_seccao_pessoal_pessoal_pessoas_vinculadas_dados_biograficos_elementos_gerais_editar'),
]
editar.html
<form method="post" action="" enctype="multipart/form-data">
{% csrf_token %}
<div class="row">
<div class="hidden">
{{ user_form.user }}
</div>
</div>
<br>
<div class="row">
<div class="col-sm-5">
{{ user_form.nome|as_crispy_field }}
</div>
<div class="col-sm-2">
{{ user_form.apelido_em_uso|as_crispy_field }}
</div>
</div>
<br>
<div class="row">
<div class="col-sm-2">
{{ user_form.genero|as_crispy_field }}
</div>
</div>
<br>
<div class="row">
<div class="col-sm-2">
{{ user_form.acesso_a_aplicacao|as_crispy_field }}
</div>
</div>
<br>
<div style="border-bottom: 1px solid rgba(0, 0, 0, 0.3);"> </div>
<br>
<button class="btn btn-success btn-sm" type="submit" class="button">Guardar</button>
<a href="/gestao/estado_maior/seccao_pessoal/pessoal/pessoas_vinculadas/dados_biograficos/{{ user.id }}/geral/"
class="btn btn-danger btn-sm"
type="button">Cancelar</a>
</form>
错误:
NoReverseMatch at /gestao/estado_maior/seccao_pessoal/pessoal/pessoas_vinculadas/dados_biograficos/geral/1/editar/
Reverse for 'estado_maior_seccao_pessoal_pessoal_pessoas_vinculadas_dados_biograficos_elementos_gerais' with no arguments not found. 1 pattern(s) tried: ['gestao\\/estado_maior\\/seccao_pessoal\\/pessoal\\/pessoas_vinculadas\\/dados_biograficos\\/(?P<pk>[0-9]+)\\/geral\\/$']
Request Method: POST
Request URL: http://127.0.0.1:8000/gestao/estado_maior/seccao_pessoal/pessoal/pessoas_vinculadas/dados_biograficos/geral/1/editar/
Django Version: 2.0.7
Exception Type: NoReverseMatch
Exception Value:
Reverse for 'estado_maior_seccao_pessoal_pessoal_pessoas_vinculadas_dados_biograficos_elementos_gerais' with no arguments not found. 1 pattern(s) tried: ['gestao\\/estado_maior\\/seccao_pessoal\\/pessoal\\/pessoas_vinculadas\\/dados_biograficos\\/(?P<pk>[0-9]+)\\/geral\\/$']
Exception Location: F:\Work\RTm_Project\GitLab\Python\gesrhu\venv\lib\site-packages\django\urls\resolvers.py in _reverse_with_prefix, line 636
Python Executable: F:\Work\RTm_Project\GitLab\Python\gesrhu\venv\Scripts\python.exe
Python Version: 3.6.6
Python Path:
['F:\\Work\\RTm_Project\\GitLab\\Python\\gesrhu',
'F:\\Work\\RTm_Project\\GitLab\\Python\\gesrhu',
'F:\\Work\\RTm_Project\\GitLab\\Python\\gesrhu\\venv\\Scripts\\python36.zip',
'C:\\Users\\fonse\\AppData\\Local\\Programs\\Python\\Python36-32\\DLLs',
'C:\\Users\\fonse\\AppData\\Local\\Programs\\Python\\Python36-32\\lib',
'C:\\Users\\fonse\\AppData\\Local\\Programs\\Python\\Python36-32',
'F:\\Work\\RTm_Project\\GitLab\\Python\\gesrhu\\venv',
'F:\\Work\\RTm_Project\\GitLab\\Python\\gesrhu\\venv\\lib\\site-packages',
'F:\\Work\\RTm_Project\\GitLab\\Python\\gesrhu\\venv\\lib\\site-packages\\setuptools-39.1.0-py3.6.egg',
'F:\\Work\\RTm_Project\\GitLab\\Python\\gesrhu\\venv\\lib\\site-packages\\pip-10.0.1-py3.6.egg',
'C:\\Program Files\\JetBrains\\PyCharm '
'2018.1.4\\helpers\\pycharm_matplotlib_backend']
Server time: Mon, 16 Jul 2018 17:57:09 +0100
回溯:
Environment:
Request Method: POST
Request URL: http://127.0.0.1:8000/gestao/estado_maior/seccao_pessoal/pessoal/pessoas_vinculadas/dados_biograficos/geral/1/editar/
Django Version: 2.0.7
Python Version: 3.6.6
Installed Applications:
['django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'modulos.autenticacao',
'modulos.administracao',
'modulos.pessoas.vinculadas',
'modulos.pessoas.naovinculadas',
'modulos.gestao',
'smart_selects',
'crispy_forms',
'django_tables2',
'mptt',
'django_cleanup',
'bootstrap3',
'auditlog']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'auditlog.middleware.AuditlogMiddleware']
Traceback:
File "F:\Work\RTm_Project\GitLab\Python\gesrhu\venv\lib\site-packages\django\core\handlers\exception.py" in inner
35. response = get_response(request)
File "F:\Work\RTm_Project\GitLab\Python\gesrhu\venv\lib\site-packages\django\core\handlers\base.py" in _get_response
128. response = self.process_exception_by_middleware(e, request)
File "F:\Work\RTm_Project\GitLab\Python\gesrhu\venv\lib\site-packages\django\core\handlers\base.py" in _get_response
126. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "F:\Work\RTm_Project\GitLab\Python\gesrhu\venv\lib\site-packages\django\contrib\auth\decorators.py" in _wrapped_view
21. return view_func(request, *args, **kwargs)
File "F:\Work\RTm_Project\GitLab\Python\gesrhu\modulos\gestao\views.py" in estado_maior_seccao_pessoal_pessoal_pessoas_vinculadas_dados_biograficos_elementos_gerais_editar
65. return HttpResponseRedirect(reverse("estado_maior_seccao_pessoal_pessoal_pessoas_vinculadas_dados_biograficos_elementos_gerais"))
File "F:\Work\RTm_Project\GitLab\Python\gesrhu\venv\lib\site-packages\django\urls\base.py" in reverse
90. return iri_to_uri(resolver._reverse_with_prefix(view, prefix, *args, **kwargs))
File "F:\Work\RTm_Project\GitLab\Python\gesrhu\venv\lib\site-packages\django\urls\resolvers.py" in _reverse_with_prefix
636. raise NoReverseMatch(msg)
Exception Type: NoReverseMatch at /gestao/estado_maior/seccao_pessoal/pessoal/pessoas_vinculadas/dados_biograficos/geral/1/editar/
Exception Value: Reverse for 'estado_maior_seccao_pessoal_pessoal_pessoas_vinculadas_dados_biograficos_elementos_gerais' with no arguments not found. 1 pattern(s) tried: ['gestao\\/estado_maior\\/seccao_pessoal\\/pessoal\\/pessoas_vinculadas\\/dados_biograficos\\/(?P<pk>[0-9]+)\\/geral\\/$']
谢谢!
答案 0 :(得分:0)
您忘记添加参数pk
,因为url模式匹配为path('too/long/path/to/<int:pk>/geral/'
return HttpResponseRedirect(reverse("estado_maior_......",kwargs={'pk':pk}))
答案 1 :(得分:0)
首先,您真的不需要提供您的URL和视图这样的长名称。名称不需要反映URL的结构; 11个元素太长了。
无论如何,该错误应该很明显:您要的是一个带有pk参数的URL,但您没有提供该参数。大概您想返回最初请求的用户的视图,因此您需要传递该参数:
return HttpResponseRedirect(reverse("estado...gerais", kwargs={'pk': pk}))
可以缩写为:
return redirect("estado...gerais", pk=pk)
但是,请更改这些名称。