python - Django NoReverseMatch URL 重定向
问题描述
我正在尝试使用 django 3 中的 allauth 自定义注册重定向 url。我收到了这个错误,而不是:
NoReverseMatch at /accounts/candidate-signup/
Reverse for 'candidate_profile' with no arguments not found. 1 pattern(s) tried: ['accounts/profile/(?P<username>[^/]+)/$']
视图.py
from django.shortcuts import render
from django.views import View
from .models import CandidateProfile
from .forms import CandidateProfileForm
from allauth.account import app_settings
from allauth.account.views import SignupView
from allauth.account.utils import complete_signup
from allauth.exceptions import ImmediateHttpResponse
class CandidateSignUpView(SignupView, View):
def get(self, request, *args, **kwargs):
form = self.form_class(request.POST)
return render(request, self.template_name, {'form': form})
def form_valid(self, form):
self.user = form.save(self.request)
self.user.is_candidate = True
self.user.save()
success_url = f'profile/{self.user.username}/'
try:
return complete_signup(
self.request,
self.user,
app_settings.EMAIL_VERIFICATION,
self.success_url,
)
except ImmediateHttpResponse as e:
return e.response
网址.py
from django.urls import path
from . import views
urlpatterns = [
path('candidate-signup/', views.CandidateSignUpView.as_view(), name='candidate_signup'),
path('company-signup/', views.CompanySignUpView.as_view(), name='company_signup'),
path('profile/<str:username>/', views.CandidateProfileView.as_view(), name='candidate_profile'),
]
django/conf/global_settings.py
LOGIN_REDIRECT_URL = 'candidate_profile'
html
<form class="signup" id="signup_form" method="post" action="{% url 'candidate_signup' %}">
{% csrf_token %}
{{ form.as_p }}
{% if redirect_field_value %}
<input type="hidden" name="{{ redirect_field_name }}" value="{{ redirect_field_value }}" />
{% endif %}
一个可行的解决方案将从注册页面重定向到/accounts/profile/<str:username>/
解决方案
你有两个问题CandidateSignUpView
:
- 您传递
self.success_url
给complete_signup
,而不是传递,这是在方法中success_url
本地定义的。form_valid
按原样self.success_url
(None
它SignupView
在您的 中定义并继承CandidateSignUpView
),complete_signup
正在接收None
forsuccess_url
参数,因此它success_url
在登录后使用默认值。 - 您最好不要手动构建 url。为此,您最好使用
reverse
并传递视图名称和相应的参数,因此success_url = f'profile/{self.user.username}/'
您最好使用success_url = reverse('candidate_profile',kwargs={'username':self.user.username})
.reverse
在这里查看更多信息。
所以,你CandidateSignUpView
应该是这样的:
from django.shortcuts import render
from django.views import View
from .models import CandidateProfile
from .forms import CandidateProfileForm
from allauth.account.views import SignupView
from allauth.account.utils import complete_signup
from allauth.exceptions import ImmediateHttpResponse
from django.http.response import HttpResponse
from django.urls.base import reverse
class CandidateSignUpView(SignupView, View):
def get(self, request, *args, **kwargs):
form = self.form_class(request.POST)
return render(request, self.template_name, {'form': form})
def form_valid(self, form):
self.user = form.save(self.request)
self.user.is_candidate = True
self.user.save()
# success_url = f'profile/{self.user.username}/'
success_url = reverse('candidate_profile',kwargs={'username':self.user.username})
try:
return complete_signup(
self.request,
self.user,
app_settings.EMAIL_VERIFICATION,
# self.success_url,
success_url
)
except ImmediateHttpResponse as e:
return e.response
推荐阅读
- vb6 - 由于“WS.Reputation.1”,Symantec Endpoint 删除了 VB6 IDE
- swift - NetService 在调试时获得正确的 Inet 类型,但不能从存档的 IPA 工作
- regex - 匹配正则表达式:仅在空格之间提取数字
- python - 从具有定义概率的 Pandas 组内进行抽样
- javascript - 函数的 Javascript 语法,Internet Explorer <= 11 (vuejs) 中的问题
- date - Google表格将文本字符串单元格转换为日期+持续时间单元格
- c++ - 获取 Windows 监视器的唯一标识符
- corda - 无法引导无法绑定其公共 IP 地址的我的 Corda 节点
- apache-beam - 使用带有通配符泛型的编码器
- javascript - 电子邮件的简单正则表达式模式