【问题标题】:Link 2 fields from a model in django从 django 中的模型链接 2 个字段
【发布时间】:2019-09-02 00:17:06
【问题描述】:

我对 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

index.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>
          

Heres a screenshot of the output app

请帮助我将单选按钮链接到列表中的任务并相应显示。 提前致谢。

【问题讨论】:

  • 这看起来是ModelForm 的好地方,也可能是CreateView
  • 您从不使用表单中的优先级,您只设置文本。
  • 只是为了分配优先级?我们可以实现任何条件/迭代语句来分配优先级吗?

标签: python html css django


【解决方案1】:

问题在你看来。在创建 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,这将使您的事情变得更容易。

【讨论】:

  • 嗨@scriptmonster 我按照您的建议进行了更改。默认的空值有效,但是当我通过超级用户检查时,优先级仍然列出了默认值(空)。优先级仍未与单个任务相关联。
  • request.POST for task_priority 解决了这个问题,但它想更好地理解第二种方法
  • 首先我的问题是错误的,而不是我编辑的。如果您创建一个 ModelForm,它将毫不费力地创建带有选项的表单。并且您不要让您的字段为空,这将帮助您轻松过滤。此外,使您的所有选择类属性都可以与人类可读的变量进行比较。在您的视图中,您可以使用优先级属性进行比较。您还可以通过选择限制值。在您的实现中,您可以将high 写入一个地方的字段,而将HIGH 写入另一个不同的地方。这个列表可以更长:)
猜你喜欢
  • 2017-01-31
  • 2023-03-22
  • 2022-01-25
  • 1970-01-01
  • 1970-01-01
  • 2019-02-05
  • 2010-10-06
  • 1970-01-01
  • 2020-06-20
相关资源
最近更新 更多