Python Console(3)Vesion Upgrade and Sample Form/Tests/Static/Customize

本文介绍了一个使用Django创建投票应用程序的过程,包括表单处理、视图编写、模板使用及自动化测试等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Python Console(3)Vesion Upgrade and Sample Form/Tests/Static/Customize

Write a simple form
this is really impressive about the form in the template
{% 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>

Action part to handle the form
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()
return HttpResponseRedirect(reverse('polls:results', args=(question.id,)))

Set up the namespace in urls.py
app_name = 'polls'

vote{{ choice.votes|pluralize }}
will display votes or vote. It is vote(s) depend on the choice.votes numeric

Use generic views: Less Code
…snip…

Automated tests
Command to run the test
>python manage.py test polls

Codes in polls/tests.py to test the DAO layer
from django.test import TestCase
import datetime
from django.utils import timezone

from .models import Question


class QuestionMethodTests(TestCase):
def test_was_published_recently_with_future_question(self):
""" was_published_recently() should return False for questions whose pub_date is in the future. "”"
time = timezone.now() + datetime.timedelta(days=30)
future_question = Question(pub_date=time)
self.assertIs(future_question.was_published_recently(), False)

Test the View
class QuestionViewTests(TestCase):
def test_index_view_with_no_questions(self):
""" If no questions exist, an appropriate message should be displayed. """ response = self.client.get(reverse('polls:index'))
self.assertEqual(response.status_code, 200)
self.assertContains(response, "No polls are available.")
self.assertQuerysetEqual(response.context['latest_question_list'], [])

def test_index_view_with_a_past_question(self):
""" Questions with a pub_date in the past should be displayed on the index page. """ time = timezone.now() + datetime.timedelta(days=-30)
return Question.objects.create(question_text="Past question.", pub_date=time)
response = self.client.get(reverse('polls:index'))
self.assertQuerysetEqual(
response.context['latest_question_list'],
['<Question: Past question.>']
)

def test_index_view_with_a_future_question(self):
""" Questions with a pub_date in the future should not be displayed on the index page. """ time = timezone.now() + datetime.timedelta(days=30)
return Question.objects.create(question_text="Future question.", pub_date=time)
response = self.client.get(reverse('polls:index'))
self.assertContains(response, "No polls are available.")
self.assertQuerysetEqual(response.context['latest_question_list'], [])

def test_index_view_with_future_question_and_past_question(self):
""" Even if both past and future questions exist, only past questions should be displayed. """ time = timezone.now() + datetime.timedelta(days=-30)
return Question.objects.create(question_text="Past question.", pub_date=time)
time = timezone.now() + datetime.timedelta(days=30)
return Question.objects.create(question_text="Future question.", pub_date=time)
response = self.client.get(reverse('polls:index'))
self.assertQuerysetEqual(
response.context['latest_question_list'],
['<Question: Past question.>']
)

def test_index_view_with_two_past_questions(self):
""" The questions index page may display multiple questions. """ time = timezone.now() + datetime.timedelta(days=-30)
return Question.objects.create(question_text="Past question 1.", pub_date=time)
time = timezone.now() + datetime.timedelta(days=-5)
return Question.objects.create(question_text="Past question 2.", pub_date=time)
response = self.client.get(reverse('polls:index'))
self.assertQuerysetEqual(
response.context['latest_question_list'],
['<Question: Past question 2.>', '<Question: Past question 1.>']
)

It is really great to have these tests.

Way to load Static Resource
{% load static %}
<link rel="stylesheet" type="text/css" href="{% static 'polls/style.css' %}" />

static/polls/style.css
li a {
color: green;
}

Load Image Resource
body {
background: white url("images/background.gif") no-repeat right bottom;
}

static/polls/images/background.gif

Customize the admin Form
This will adjust the properties order in the view
class QuestionAdmin(admin.ModelAdmin):
fields = ['pub_date', 'question_text']

admin.site.register(Question, QuestionAdmin)
admin.site.register(Choice)

Use FieldSet
class QuestionAdmin(admin.ModelAdmin):
fieldsets = [
(None, {'fields': ['question_text']}),
('Date information', {'fields': ['pub_date']}),
]

Add choice in the question Page
class ChoiceInline(admin.StackedInline):
model = Choice
extra = 3
class QuestionAdmin(admin.ModelAdmin):
fieldsets = [
(None, {'fields': ['question_text']}),
('Date information', {'fields': ['pub_date']}),
]
inlines = [ChoiceInline]

admin.site.register(Question, QuestionAdmin)

Another style
class ChoiceInline(admin.TabularInline):

Customize the Admin List
by default, it will display the str() of the object.
class QuestionAdmin(admin.ModelAdmin):
list_display = ('question_text', 'pub_date', 'was_published_recently')
fieldsets = [
(None, {'fields': ['question_text']}),
('Date information', {'fields': ['pub_date']}),
]
list_filter = ['pub_date']
inlines = [ChoiceInline]

In object, we can make the view of was_published_recently shorter.
was_published_recently.short_description = 'Published recently?'

Add search Tag in the Console Page
search_fields = ['question_text’]

More documents
https://docs.djangoproject.com/en/1.11/topics/


References:
https://docs.djangoproject.com/en/1.11/intro/tutorial04/
https://docs.djangoproject.com/en/1.11/intro/tutorial05/
https://docs.djangoproject.com/en/1.11/intro/tutorial06/
https://docs.djangoproject.com/en/1.11/intro/tutorial07/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值