问题描述
所以我有这些使用 POST 请求进行注册和登录的工作视图,它们都返回 profile.html。
问题是当我提交表单(根据 cmd)以运行必要的功能时,登录和注册视图将 POST 返回到登录或注册 URL。 这意味着它只是渲染 profile.html,而不是运行 ITS 视图功能。
我如何让表单提交向配置文件视图发送 GET,同时仍然让他们为各自的功能发送 POST。
观看次数:
def log_in(request):
if request.method == 'POST':
form = log_form(request.POST)
if form.is_valid():
username = form.cleaned_data['username']
password = form.cleaned_data['password']
user = authenticate(request,username=username,password=password)
if user is not None:
print("user exists")
login(request,user)
return render(request,'profile.html')
else:
print("user does not exist")
print(form.errors)
return render(request,'login.html',{
'form2': log_form
})
else:
return render(request,{
'form2': log_form
})
else:
return render(request,{
'form2': log_form
})
def profile(request,username):
if request.method == 'GET':
user = Users.objects.get(username=username)
interests = []
interest_list = Interests.objects.filter(member=user)#i got 5 objs here
for i in interest_list:
interests.append(i.item)
print('added interest')
info = Bios.objects.get(author=user)
return render(request,'profile.html',{
'user': user,"interests": interests,'info': info
})
网址:
urlpatterns = [
path('reg/',views.register,name='register'),path('log/',views.log_in,name='login'),path('profile/<str:username>/',views.profile,name='profile'),path('Feed/',views.Feed,name='Feed')
] + static(settings.MEDIA_URL,document_root=settings.MEDIA_ROOT)
登录表单:
<form method='POST' action="{%url 'login' %}">
{% csrf_token %}
<p>Username: {{form2.username}}</p>
<p>Password: {{form2.password}}</p>
{{form2.errors}}
<input type="submit" value="submit">
<p style='margin-top: 10px;'>Don't have an account?<a href="{% url 'register' %}"> Register</a></p>
</form>
注册表:
<form method='POST' action="{% url 'register' %}">
{% csrf_token %}
<p>Username: {{form.username}}</p>
<p>Email: {{form.email}}</p>
<p>Password: {{form.password}}</p>
<p>Phone: {{form.phone}}</p>
<p>First name: {{form.first_name}}</p>
<p>Last name: {{form.last_name}}</p>
{{form.errors}}
{% if form.errors %}
{% for field in form %}
{% for error in field.errors %}
<p>
<strong>{{ error|escape }}</strong>
</p>
{% endfor %}
{% endfor %}
{% for error in form.non_field_errors %}
<p>
<strong>{{ error|escape }}</strong>
</div>
{% endfor %}
{% endif %}
<input type='submit' value='Submit'>
<p style="margin-top: 5px;">Already have an account?<a href="{% url 'login' %}"> Log In</a></p>
</form>
解决方法
登录页面应该被访问两次:当用户被重定向到它时,所以使用 GET,当用户发送填写好的表单时再次使用,这次使用 POST。您的视图逻辑应该处理两种类型的请求:
def user_login(request):
if request.POST:
form = UserForm(request.POST) # note that I renamed your form
username = request.POST['username']
password = request.POST['password']
user = authenticate(username=username,password=password)
if user is not None:
if user.is_active:
login(request,user)
return redirect('profile',kwargs={username=user})
else: # request is GET
form = UserForm()
return render(request,'login.html',{'form': form})
@require_GET()
def profile(request,username):
user = Users.objects.get(username=username)
interests = Interests.objects.filter(member=user).values_list('item',flat=True)
info = Bios.objects.get(author=user)
context = {
'user': user,"interests": interests,'info': info
}
return render(request,'profile.html',context)
我还稍微更改了配置文件视图,以使用我认为是基于 Django 函数的视图中的最佳实践。