Django表单

新建polls/templates/polls/detail.html

<h1>{{ question.question_text }}
</h1>

{% if error_message %}
<p>
<strong>{{ error_message }}
</strong>
</p>
{% endif %}

<form action="{% url 'polls:vote' question.id %}" method="post">
{% csrf_token %}
{% for choice in question.choice_set.all %}
<input type="radio" name="choice" id="choice{{ forloop.counter }}" value="{{ choice.id }}">
<label for="choice{{ forloop.counter }}">{{ choice.choice_text }}
</label>
<br>
{% endfor %}
<input type="submit" value="Vote">
</form>

 

新建polls/templates/polls/results.html

<h1>{{ question.question_text }}</h1>

<ul>
{% for choice in question.choice_set.all %}
<li>{{ choice.choice_text }} -- {{ choice.votes }} vote{{ choice.votes|pluralize }}</li>
{% endfor %}
</ul>

<a href="{% url 'polls:detail' question.id %}">Vote again?</a>

 

修改polls包里面的views.py

from django.http import HttpResponseRedirect
from django.shortcuts import get_object_or_404, render
from django.urls import reverse
from django.views import generic

from polls.models import Question, Choice


# Create your views here.


class IndexView(generic.ListView):
template_name = 'polls/index.html'
context_object_name = 'latest_question_list'

def get_queryset(self):
"""返回最后五个已发布的问题."""
return Question.objects.order_by('-pub_date')[:5]


class DetailView(generic.DetailView):
model = Question
template_name = 'polls/detail.html'


class ResultsView(generic.DetailView):
model = Question
template_name = 'polls/results.html'


def vote(request, question_id):
question = get_object_or_404(Question, pk=question_id)
try:
selected_choice = question.choice_set.get(pk=request.POST['choice'])
except (KeyError, Choice.DoesNotExist):
# 重新发布投票问题表单
return render(request, 'polls/detail.html', {
'question': question,
'error_message': "You didn't select a choice.",
})
else:
selected_choice.votes += 1
selected_choice.save()
# 成功处理post数据后,始终返回HttpResponseRedirect
# 如果用户点击后退按钮,这将防止两次发布数据。
return HttpResponseRedirect(reverse('polls:results', args=(question.id,)))

修改polls包里面的polls_urls.py

from django.urls import path
from . import views

app_name = 'polls'

urlpatterns = [
path('', views.IndexView.as_view(), name='index'),
# 示例:/polls/

path('<int:pk>/', views.DetailView.as_view(), name='detail'),
# 示例:/polls/5/

path('<int:pk>/results/', views.ResultsView.as_view(), name='results'),
# 示例:/polls/5/results/

path('<int:question_id>/vote/', views.vote, name='vote'),
# 示例:/polls/5/vote/
]

 

python manage.py runserver

启动服务


http://127.0.0.1:8000/polls/

转载于:https://www.cnblogs.com/yjlch1016/p/8707773.html

Django 框架中,表单处理是构建 Web 应用程序的核心部分之一。Django 提供了强大的 `forms` 模块来简化表单的创建、验证和处理流程。以下是 Django 表单处理的常见实践和关键步骤: ### 表单定义 Django 中的表单通常通过继承 `forms.Form` 或 `forms.ModelForm` 来定义。`forms.Form` 适用于手动定义字段,而 `forms.ModelForm` 则直接基于模型生成表单字段。 ```python from django import forms from .models import Article class ArticleForm(forms.ModelForm): class Meta: model = Article fields = ['title', 'content', 'pub_date'] ``` ### 表单验证 Django 表单支持字段级别的验证以及表单级别的验证。可以通过在表单类中定义 `clean_<field_name>` 方法实现字段验证,也可以通过 `clean` 方法实现跨字段验证。 ```python def clean_title(self): title = self.cleaned_data.get('title') if len(title) < 5: raise forms.ValidationError("标题必须至少包含5个字符") return title def clean(self): cleaned_data = super().clean() title = cleaned_data.get('title') content = cleaned_data.get('content') if title and content and title in content: raise forms.ValidationError("标题不应直接出现在内容中") ``` ### 表单处理与提交 在视图中,表单通常通过 `POST` 请求接收数据,并使用 `is_valid()` 方法进行验证。如果验证通过,可以通过 `save()` 方法将数据保存到数据库。 ```python def create_article(request): if request.method == 'POST': form = ArticleForm(request.POST) if form.is_valid(): form.save() return redirect('article_list') else: form = ArticleForm() return render(request, 'article_form.html', {'form': form}) ``` ### 安全性考虑 Django表单系统内置了对 CSRF(跨站请求伪造)攻击的防护机制,通过 `{% csrf_token %}` 模板标签实现。此外,对于用户认证和权限控制,可以通过 `@login_required` 装饰器或在表单中加入用户字段进行限制[^3]。 ### 模板渲染 Django 提供了简洁的语法来渲染表单字段,支持手动控制每个字段的显示方式,以满足不同的前端需求。 ```html <form method="post"> {% csrf_token %} {{ form.as_p }} <button type="submit">提交</button> </form> ``` ### 最佳实践 - **使用 ModelForm**:尽量使用 `ModelForm` 以减少重复代码并保持数据一致性。 - **自定义验证逻辑**:根据业务需求实现字段和表单级别的验证。 - **前端与后端协同**:确保前端表单与后端验证逻辑一致,提升用户体验。 - **安全性**:始终启用 CSRF 保护,并对敏感操作实施权限控制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值