Ссылка 2 поля из модели в Джанго - PullRequest
3 голосов
/ 11 апреля 2019

Я относительно новичок в Django, и я составил список Todo, где пользователь может добавить задачу и отметить, если она выполнена. Я добавил поле формы приоритетов, которое является виджетом выбора радио. В зависимости от приоритета поле задачи будет красного, оранжевого или зеленого цвета.

Переключатели отображаются правильно, и я не могу опубликовать задачу без указания приоритета ввода. Но приоритет всегда берется по умолчанию (высокий).

Я попробовал пару вещей, чтобы изменить и отобразить приоритеты, но ничего не получалось. Я верю, что что-то в 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>
          

Вот скриншот выходного приложения

Пожалуйста, помогите мне связать переключатель с задачей в списке и отобразить соответственно. Заранее спасибо.

1 Ответ

1 голос
/ 11 апреля 2019

Проблема на ваш взгляд.При создании объекта Todo приоритет не передается.

       new_todo = Todo(text = request.POST['text'], task_priority = request.POST['priority'])

Приведенный выше код решает вашу проблему.Но я НЕ РЕКОМЕНДУЮ этого.Вы не используете формы Джанго.Пожалуйста, используйте Django forms.cleaned_data для получения параметров вместо request.POST или используйте ModelForm, которая позволит вам сохранять данные из экземпляра формы напрямую.


Совет по изменению модели

Однако я не хотел бы решить эту проблему.Вы можете изменить свою модель следующим образом, чтобы иметь более джангоистский способ сделать это:

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, что значительно облегчит вам задачу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...