Когда я передаю параметр url в modelform, вместо параметра url передается None
Я пытаюсь создать веб-страницу для постинга.
Вот как это работает:
вы нажимаете на кнопку, появляется форма отправки, вы заполняете форму, нажимаете кнопку отправки, и процесс завершен. И когда форма будет отправлена, url-параметр будет передан как значение скрытого входа в модельформе в views.py.
Однако, когда я просматриваю модель в manage.py shell
, None
сохраняется вместо url-параметра.
Вот коды:
models.py
from django.db import models
from django.db.models import CharField, TextField, DateField
class Post(models.Model):
username = CharField(max_length=30, blank=True, null=True)
content = TextField()
dt_created = DateField(auto_now_add=True)
dt_modified = DateField(auto_now=True)
def __str__(self):
return self.username
forms.py
from django import forms
from django.forms import Textarea, HiddenInput
from .models import Post
class PostForm(forms.ModelForm):
class Meta:
model = Post
fields = ['content', 'username']
widgets = {
'content': Textarea(attrs={
'class': 'write_input',
'placeholder': 'write your story here...'
}),
'username': HiddenInput(attrs={
'value': ' '
})
}
labels = {
'content': ''
}
urls.py
from django.urls import path, include
from . import views
urlpatterns = [
path('<str:username>/main/', views.account_main, name='account_main')
]
views.py
from django.shortcuts import render, redirect
from .forms import PostForm
from .models import Post
def account_main(request, username):
context = dict()
if request.method == 'POST':
form = PostForm(request.POST, initial={'username': username})
if form.is_valid():
form.save()
return redirect('account_main', username=username)
form = PostForm()
posts = Post.objects.all().order_by('dt_created')
context['username'] = username
context['form'] = form
context['posts'] = posts
return render(request, 'Account/account_main.html', context=context)
Что я пробовал:
Передача initial={'username': username}
в качестве kwargs в PostForm()
,
Доступ к cleaned_data и передача параметра url в качестве значения, как: form.cleaned_data['username'] = username
Я не смог найти решение этой проблемы в Google или Stack Overflow до сих пор. Заранее благодарю вас за ответ!
Если ваш основной мотив - передать скрытое поле вместе с формой, вы можете напрямую отправить, не включая его в URL. И вы можете получить файлы по
-->request.POST.get(#fieldName)
Я нашел решение.
После того, как form.is_valid()
возвращает значение True
, я сохраняю форму по команде form = form.save(commit=False)
.
Затем я передаю параметр url в качестве значения для form.username
. Наконец, я сохраняю форму по команде form.save()
.
.
Когда я просматриваю модель, параметр url сохраняется, как и значение имени пользователя.
Вот код после того, как я его модифицировал:
def account_main(request, username):
context = dict()
if request.method == 'POST':
form = PostForm(request.POST)
if form.is_valid():
form = form.save(commit=False)
form.username = username
form.save()
return redirect('account_main', username=username)