Как динамически заполнить форму 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})

На изображении текст должен быть предварительно заполнен.

enter image description here

когда вы объявляете или выводите форму в представлении и отправляете ее в шаблон. используйте начальный аргумент и передайте в него словарь с ключом как имя поля и значением как текст, который вы хотите заполнить.

вот так 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");

Вернуться на верх