Как редактировать поле формы для добавления некоторого условия с помощью шаблона Django

У меня есть форма (ModelForm, Model и view).

Все работает хорошо, но есть новое требование в проекте и один из text-input больше не является простым, мне нужно использовать некоторый шаблон Django (if condition).

Это именно то HTML представление ввода, которое мне нужно (и оно работает отдельно):

<input class="form-control ts_project" id="ts_project" name="ts_project" type="text" {% if entry.project %}value="{{ entry.project.id }}: {{ entry.project.name }}"{% endif %}>

Что я пробовал:

  • отредактируйте атрибуты виджета в forms.py так, чтобы он выглядел как можно ближе к HTML-коду выше, но у меня это не получилось.

forms.py:

from django.forms import ModelForm
from django import forms
from expense.models import Expense

class ExpenseForm(ModelForm):
    class Meta:
        model = Expense
        fields = ['project']
        widgets = {
            'project': forms.TextInput(
                attrs={
                    'class': 'form-control ts_project',
                    'id': 'ts_project',
                    'name': 'ts_project',
                    {% if entry.project %}
                    'value':'{{ entry.project.id }}: {{ entry.project.name }}'
                    {% endif %},
                    }
            )
        }

Код не работает, но я не могу придумать другой способ заставить его работать. class, id and name работает как ожидалось, если я удалю value и весь код шаблона Django.

models.py (truncated):

from django.db import models
from django.contrib.auth.models import User
from project.models import Project
from expense.constants import *

class Expense(models.Model):

    project = models.TextField(
        blank=True,
        null=True,
        default=None
    )

views.py (truncated):

from django.shortcuts import render
from expense.models import Expense
from expense.forms import ExpenseForm
from project.models import Project

def new_expense(request):
    form = ExpenseForm()
    if request.method == "POST":
        form = ExpenseForm(request.POST)
        if form.is_valid():
            form.save()
    data['form'] = form
    return render(request, "expense/new_expense.html", data)

Как я могу добавить условие через шаблоны django к виджету / полю формы Django?

В вашем ExpenseForm вы можете изменить атрибуты виджета на основе некоторых произвольных критериев с помощью __init__.

Например, допустим, вы передаете объект entry в вашей форме, и вы хотите изменить виджет на основе этого:

class ExpenseForm(ModelForm):
    ...
    def __init__(self, *args, **kwargs):
        entry = kwargs.pop('entry')
        super().__init__(*args, **kwargs)
        if entry:
            self.fields['project'].widget.attrs.update({'value': entry.project})
Вернуться на верх