Как предварительно заполнить поля Django ModelForm - PullRequest
0 голосов
/ 31 октября 2018

У меня есть следующая ModelForm:

class IssueProcessForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(IssueProcessForm, self).__init__(*args, **kwargs)

        self.fields['number'].disabled = True
        self.fields['title'].disabled = True
        self.fields['body'].disabled = True

        self.fields['body'].widget = forms.Textarea(
            attrs={
                'cols': 50
            }
        )

    class Meta:
        model = Issue
        fields = (
            'number', 'title', 'body', 'price'
        )

Я хочу предварительно заполнить поля number, title и body данными из представления, визуализировать форму и убедиться, что значения, соответствующие полям, отображаются при отключении этих полей, поэтому этот пользователь не будет изменять значения. Я хочу, чтобы поле price было единственным, к чему пользователь прикасается, а когда нажимается кнопка сохранения, я хочу, чтобы все сохранялось в базе данных. Я попробовал следующее:

def issue_process(request, repo_name, issue_number):
    get_issue_number = request.session.get('issue_number_{}'.format(issue_number))
    get_issue_title = request.session.get('issue_number_{}_title'.format(issue_number))
    get_issue_body = request.session.get('issue_number_{}_body'.format(issue_number))

    if request.method == 'POST':
        form = IssueProcessForm(request.POST)
        if form.is_valid():
            issue = form.save(commit=False)
            issue.number = get_issue_number
            issue.title = get_issue_title
            issue.body = get_issue_body
            issue.save()
    else:
        form = IssueProcessForm(initial={
            'number': get_issue_number,
            'title': get_issue_title,
            'body': get_issue_body
        })
    return render(request, 'core/issue_process.html', {'form': form})

... но каждое из трех полей продолжает говорить this field is required, когда я пытаюсь отправить. Что я могу сделать, пожалуйста? Обратите внимание, что get_issue_number, get_issue_title, get_issue_body - это значения, которые я хотел бы предварительно заполнить в полях number, title и body соответственно.

1 Ответ

0 голосов
/ 31 октября 2018

Когда вы отключаете поле формы, браузер не отправляет значение поля при отправке формы. Поэтому вам необходимо предоставить исходные данные для запросов POST, а также запросов GET:

if request.method == 'POST':
    form = IssueProcessForm(
        request.POST,
        initial={
            'number': get_issue_number,
            'title': get_issue_title,
            'body': get_issue_body
        },
    )
    ...
...