Как динамически заполнить форму django
Я пытаюсь отобразить форму в django и предварительно заполнить ее динамически. Я хочу, чтобы пользователь моего образца сайта по сбору новостей мог изменить запись.
У меня есть класс формы ручного ввода
#forms.py
class ManualInputForm(forms.Form):
source = forms.CharField(label="Source:", widget = forms.TextInput(attrs={'size': 97}))
topic = forms.CharField(label="Topic:", widget = forms.TextInput(attrs={'size': 97}))
news = forms.CharField(widget = forms.Textarea(attrs={"rows":5, "cols":100}))
link = forms.CharField(label="Link (optional):", required = False, widget = forms.TextInput(attrs={'size': 97}))
В HTML я иду вручную, потому что хочу предварительно заполнить все поля данными, поступающими из связанной функции в views.py
.
#html file
<form method="post" class="form-group">
{% csrf_token %}
<div class="input-group mb-3">
<div class="container">
{% for field in form %}
<div class="fieldWrapper">
{{ field.errors }}
{{ field.label_tag }}
<br>
{{ field }}
</div>
{% endfor %}
</div>
<div class="input-group">
<p> </p>
<button type="submit" class="btn btn-success" name="Submit">Save</button>
</div>
</div>
</form>
Как мне это сделать? Это сводит меня с ума o.O Я бы хотел продолжать использовать формы django из-за встроенного менеджера ошибок (не все поля обязательны, но некоторые обязательны, и я бы хотел, чтобы django продолжал управлять ими).
Спасибо за ваши предложения!
РЕДАКТИРОВАТЬ: в соответствии с просьбой я размещаю связанную с views.py функцию:
#views.py
def editnews(response, id):
form = ManualInputForm(response.POST or None)
#tableToView is a dataframe retrieved by querying an external DB
#data cannot be stored in django's buit in because of reasons ;-)
#checking the dataframe is correct and it is:
#IT IS MADE OF A SINGLE LINE
print(tableToView)
#THIS IS PROBABLY NOT THE WAY TO DO IT
form.source = tableToView.loc[0, 'Source']
form.topic = tableToView.loc[0, 'Topic']
form.news = tableToView.loc[0, 'News']
form.link = tableToView.loc[0, 'Link']
return render(response, 'manual/editnews.html', {"form":form})
На изображении текст должен быть предварительно заполнен.
когда вы объявляете или выводите форму в представлении и отправляете ее в шаблон. используйте начальный аргумент и передайте в него словарь с ключом как имя поля и значением как текст, который вы хотите заполнить.
вот так context['form'] = NameofForm(initial={'Source':'mysite', 'Topic':'mytopic'}) return context
Update
> def test_view(request, pk):
> template_name = 'form.html'
> form = MyForm(initial={"test":"initialize with this value"})
> if request.method == 'POST':
> form = MyForm(request.POST)
> if form.is_valid():
> form.save()
> return HttpResponseRedirect(reverse('list-view'))
>
> return render(request, template_name, {'form': form})
Попробуйте что-нибудь вроде этого:
def editnews(response, id):
data = {k.lower(): v for k, v in tableToView.loc[0].to_dict().items()}
form = ManualInputForm(response.POST or None, initial=data)
return render(response, 'manual/editnews.html', {'form': form})
Попробуйте это:
#views.py
def editnews(response, id):
data = {}
data["source"] = tableToView.loc[0, 'Source']
data["topic"] = tableToView.loc[0, 'Topic']
data["news"] = tableToView.loc[0, 'News']
data["link"] = tableToView.loc[0, 'Link']
form = ManualInputForm(response.POST or None, initial=data)
return render(response, 'manual/editnews.html', {"form":form})
Вы можете сделать это с помощью jQuery, если вы его используете. Вам нужно будет установить атрибут id для поля формы.
Пример кода jQuery:
$('#topic').val("Prefilled text goes here");