Я новичок в 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 %}
Когда я открываю веб-страницу формы, я получаю пустое поле ввода и кнопку отправки. Но когда я нажимаю эту кнопку. Страница перезагружается и больше ничего.
что мне нужно сделать, чтобы я мог работать с введенными данными?






Не совсем уверен, чего именно вы пытаетесь достичь. Однако, если вы хотите отобразить на экране значение вашей предыдущей отправки, например, как: 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>
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 используется в шаблоне для определения того, что показывать. Надеюсь это поможет :)
Привет, спасибо за комментарии. Я изменил это на примере Nrzonline. Можно ли также сохранить данные, которые не запрашиваются в форме? Как Дата или что-то в этом роде?