我对 Django 比较陌生,我做了一个待办事项列表,用户可以在其中添加任务并标记任务是否完成。我添加了一个优先级表单字段,它是一个单选选择小部件。根据优先级,任务域将具有红色、橙色或绿色。
单选按钮正确显示,如果不给出输入优先级,我就无法发布任务。但是优先级始终被视为默认值(高(。
我尝试了几件事来更改和显示优先级,但没有任何效果。我相信 views.py 中的某些内容将被修改以使其工作,但由于我缺乏经验,我无法对其进行说明。
Views.py
@require_POST
def addTodo(request):
form = TodoForm(request.POST)
#print(request.POST['text'])
if form.is_valid():
new_todo = Todo(text = request.POST['text'])
new_todo.save()
for item in form:
return redirect('index')
def completeTodo(request, todo_id):
todo = Todo.objects.get(pk=todo_id)
todo.complete = True
todo.save()
return redirect('index')
form.py
from django import forms
prior_choice =[('high','High'),('mod','Mod'),('low','Low')]
class TodoForm(forms.Form):
text = forms.CharField(max_length = 40,
widget = forms.TextInput(
attrs= {'class': 'form-control', 'placeholder': 'Enter todo e.g. Delete junk files', 'aria-label': 'Todo', 'aria-describedby':'add-btn'}))
priority = forms.CharField(widget=forms.RadioSelect(choices=prior_choice))
models.py
from django.db import models
class Todo(models.Model):
text = models.CharField(max_length=40)
complete = models.BooleanField(default = False)
task_priority = models.CharField(max_length=40, default='high')
def __str__(self):
return self.text
索引.html
<ul class="list-group t20">
{% for todo in todo_list %}
{% if todo.task_priority == 'high'%}
<a href=" {% url 'complete' todo.id %}" ><li class="list-group-item " style="background-color: red;"> {{ todo.text}}</li></a>
{%elif todo.task_priority == 'mod'%}
<a href=" {% url 'complete' todo.id %}" ><li class="list-group-item " style="background-color: orange;"> {{ todo.text}}</li></a>
{%elif todo.task_priority == 'low'%}
<a href=" {% url 'complete' todo.id %}" ><li class="list-group-item " style="background-color: yellow;"> {{ todo.text}}</li></a>
{%else%}
<div class="todo-completed"> <li class="list-group-item" style="background-color: green;"> {{ todo.text}}</li></div>
{%endif%}
{% endfor %}
</ul>
这是输出应用程序的屏幕截图
请帮助我将单选按钮链接到列表中的任务并相应地显示。提前谢谢。
问题出在您看来。创建 Todo
对象时,不会传递优先级。
new_todo = Todo(text = request.POST['text'], task_priority = request.POST['priority'])
上面的代码解决了您的问题。但我不推荐它。你没有利用 Django 表单。请使用 Django forms.cleaned_data
来获取参数而不是request.POST
或使用 ModelForm,这将允许您直接从表单实例保存。
模型更改建议
但是,这不是我想解决问题的方式。您可以按如下方式更改模型,以获得更多的 djangoic 方式:
from django.utils.translation import ugettext_lazy as _
class Todo(models.Model):
PRIORITY_NONE = 0
PRIORITY_LOW = 1
PRIORITY_MODERATE = 2
PRIORITY_HIGH = 3
PRIORITIES = (
(PRIORITY_NONE, _('')),
(PRIORITY_LOW, _('Low')),
(PRIORITY_MODERATE, _('Moderate')),
(PRIORITY_HIGH, _('High')),
)
...
task_priority = models.PositiveSmallIntegerField(choices=PRIORITIES, default=PRIORITY_NONE)
您可能需要使用Todo.PRIORITIES
选项更改表单。此外,您可能还想使用ModelForm
这将使您更轻松。