Формы Python Django, форма не работает с введенными данными

Я новичок в Django, и я пытаюсь включить свою собственную форму

Мои формы.py

class MyOwnForm(forms.ModelForm):
    class Meta:
        model = Album
        fields = ['username']

Мой views.py

def testing_Form(request):
    if not request.user.is_authenticated:
        return render(request, 'login.html')
    else:
        form = MyOwnForm(request.POST or None)
        if form.is_valid():
            album = form.save(commit=False)
            album.user = request.user
            username = form.cleaned_data['username']

        return render(request, 'form.html', {'form': form})

мой form.html

<form class = "form-horizontal" role = "form" action = "" method = "post" enctype = "multipart/form-data">
    {% csrf_token %}
    {% include 'form_template.html' %}
    <div class = "form-group">
        <div class = "col-sm-offset-2 col-sm-10">
            <button type = "submit" class = "btn btn-success">Submit</button>
        </div>
    </div>
</form>

и последний form_template.html

{% for field in form %}
    <div class = "form-group">
        <div class = "col-sm-offset-2 col-sm-10">
            <span class = "text-danger small">{{ field.errors }}</span>
        </div>
        <label class = "control-label col-sm-2" >{{ field.label_tag }}</label>
        <div class = "col-sm-10">{{ field }}</div>
    </div>
{% endfor %}

Когда я открываю веб-страницу формы, я получаю пустое поле ввода и кнопку отправки. Но когда я нажимаю эту кнопку. Страница перезагружается и больше ничего.

что мне нужно сделать, чтобы я мог работать с введенными данными?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
64
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Не совсем уверен, чего именно вы пытаетесь достичь. Однако, если вы хотите отобразить на экране значение вашей предыдущей отправки, например, как: Previous submitted username: <input username>, вы можете использовать определенный form в своем шаблоне, включая значения, если ранее была отправка.

{% if form.username.value %}
    Previous submitted username: {{ form.username.value }}
{%  endif %}

<form class = "form-horizontal" role = "form" action = "" method = "post" enctype = "multipart/form-data">
    {# ... all as it was ... #}
</form>

Вы всегда можете добавить дополнительный контекст в свой шаблон, назначив его контекстному словарю аналогично тому, как вы делали с {'form': form} как {'form': form, 'hello': "My hello string"} в вашем представлении. Теперь в вашем шаблоне вы можете использовать {{ hello }} в качестве переменной.

Обратите внимание, что вы также используете commit=False в своей форме, чтобы добавить дополнительные данные запроса в модель после (user). В настоящее время вы оставили его в состоянии unsaved. Чтобы сохранить новую запись в форме, вам необходимо вызвать в album.save() после внесения изменений.

if form.is_valid():
    album = form.save(commit=False)
    album.user = request.user
    album.save() # now commit

username = form.cleaned_data['username'] был определен, но никогда не использовался. Что в приведенном выше примере больше не требуется.

Вы можете получить объекты альбома, когда пользователь аутентифицирован, и передать их в шаблон для работы в качестве контекста, например:
(плохой стиль практики, но просто чтобы дать вам представление в рамках вашего кода)

if request.user.is_authenticated:
    return render(request, 'login.html')
else:
    form = AlbumForm(request.POST or None)

    if form.is_valid():
        album = form.save(commit=False)
        album.user = request.user

    albums = Album.objects.all()

    return render(request, 'formhandle/form.html', {'form': form, 'albums': albums})

Что вы можете отобразить в шаблоне формы как:

{% if form.username.value %}
    Previous submitted username: {{ form.username.value }}
{%  endif %}

<form class = "form-horizontal" role = "form" action = "" method = "post" enctype = "multipart/form-data">
    {# ... all as it was ... #}
</form>

<ul>
    {% for album in albums %}
        <li>{{ album.user.username }}</li>
    {% endfor %}
</ul>

Привет, спасибо за комментарии. Я изменил это на примере Nrzonline. Можно ли также сохранить данные, которые не запрашиваются в форме? Как Дата или что-то в этом роде?

Snowball 17.05.2018 09:19
Ответ принят как подходящий

But when I click this button. The page is reloading and nothing more.

Из-за этого я предполагаю, что вы собираетесь показать некоторую информацию после отправки формы. Вот простой пример, который просто отображает подтверждение после отправки формы.

{% if submitted %}

    <div class = "jumbotron contactainer">
        <h1 class = "display-4">Submitted</h1>
        <hr class = "my-4">
        <p class = "lead">{{ username }}'s album has been submitted</p>
    </div>

{% else %}


<form class = "form-horizontal" role = "form" action = "" method = "post" enctype = "multipart/form-data">
    {% csrf_token %}
    {% include 'form_template.html' %}
    <div class = "form-group">
        <div class = "col-sm-offset-2 col-sm-10">
            <button type = "submit" class = "btn btn-success">Submit</button>
        </div>
    </div>
</form>

{% endif %}

views.py

def testing_Form(request):
    submit = False
    if not request.user.is_authenticated:
        return render(request, 'login.html')
    else:
        form = MyOwnForm(request.POST or None)
        if form.is_valid():
            album = form.save(commit=False)
            album.username = request.user
            album.save()
            submit = True 
            username = form.cleaned_data['username']
            return render(request, 'form.html', {'username':username, 'submitted':submit})
        else:
            return render(request, 'form.html', {'form': form, 'submitted':submit})

Вы можете делать все, что хотите, с переменной username или добавлять новые переменные, просто не забудьте добавить их в контекстный словарь, если вы хотите их отобразить. Добавленная мной переменная submit используется в шаблоне для определения того, что показывать. Надеюсь это поможет :)

Другие вопросы по теме