Как редактировать поле формы для добавления некоторого условия с помощью шаблона 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})