Django 视图返回 POST 而不是 GET 请求
Django view returning POST instead of GET request
所以我有这些使用 POST 请求注册和登录的工作视图,这两个请求都 returning profile.html.
问题是登录和注册视图 return 当我提交表单(根据 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, 'login.html', {
'form2': log_form
})
else:
return render(request, 'login.html', {
'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 函数的视图的最佳实践。
所以我有这些使用 POST 请求注册和登录的工作视图,这两个请求都 returning profile.html.
问题是登录和注册视图 return 当我提交表单(根据 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, 'login.html', {
'form2': log_form
})
else:
return render(request, 'login.html', {
'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 函数的视图的最佳实践。