如何在 Django 中保存来自 base.html 的表单数据?
How to save form data from base.html in django?
在我的应用程序中,我创建了一个 context_proccessors.py
来将表单显示到 base.html
文件。
我可以在 base.html
文件中显示表格。但我面临的问题是我不知道如何从 base.html
保存表单数据,因为 base.html
没有 view
。下面是我的代码:
models.py
class Posts(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='user_posts')
post_pic = models.ImageField(upload_to='post_pic', verbose_name="Image")
post_caption = models.TextField(max_length=264, verbose_name="Caption")
created_date = models.DateTimeField(auto_now_add=True)
edited_date = models.DateTimeField(auto_now=True)
def __str__(self):
return f"{self.user.username}"
forms.py
from django import forms
from post_app.models import Posts
class PostForm(forms.ModelForm):
class Meta:
model = Posts
exclude = ('user',)
context_proccessors.py
from post_app.forms import PostForm
def post_form(request):
form = PostForm
return {
'post_form': form,
}
base.html
<form method="POST" enctype="multipart/form-data">
{{ post_form|crispy }}
{% csrf_token %}
<button type="submit" class="btn btn-primary">Post</button>
</form>
我希望表单显示在每个页面上,以便用户可以从任何地方提交数据
def PostView(request):
form = PostForm()
if request.method == 'GET':
return render(request, 'base.html', {form:form})
elif request.method == 'POST':
form.save(request.data)
在您的应用程序的 views.py 中,您可以定义此视图,并且您必须在根目录的 urls.py 中为其提供一个 url。所以每次有一个关于 url 的请求,如果方法是 GET,表单将呈现在 base.html 文件上,如果方法是 POST,post将被保存。
按照 N T
的回答,我实现了这个。因此,我必须为视图制作一个 URL 模式,并以 base.html
.
的形式在操作中使用该 URL 模式
view.py
@login_required
def postsaveview(request):
form = PostForm()
if request.method == 'POST':
form = PostForm(request.POST, request.FILES)
if form.is_valid():
user_obj = form.save(commit=False)
user_obj.user = request.user
user_obj.slug = str(request.user) + str(uuid.uuid4())
user_obj.save()
return HttpResponseRedirect(reverse('profile_app:profile'))
urls.py
urlpatterns = [
path('post-save/', views.postsaveview, name='post-save'),
]
base.html
<form action="{% url "post-save" %}" method="POST" enctype="multipart/form-data">
{{ post_form|crispy }}
{% csrf_token %}
<button type="submit" class="btn btn-primary">Post</button>
</form>
在我的应用程序中,我创建了一个 context_proccessors.py
来将表单显示到 base.html
文件。
我可以在 base.html
文件中显示表格。但我面临的问题是我不知道如何从 base.html
保存表单数据,因为 base.html
没有 view
。下面是我的代码:
models.py
class Posts(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='user_posts')
post_pic = models.ImageField(upload_to='post_pic', verbose_name="Image")
post_caption = models.TextField(max_length=264, verbose_name="Caption")
created_date = models.DateTimeField(auto_now_add=True)
edited_date = models.DateTimeField(auto_now=True)
def __str__(self):
return f"{self.user.username}"
forms.py
from django import forms
from post_app.models import Posts
class PostForm(forms.ModelForm):
class Meta:
model = Posts
exclude = ('user',)
context_proccessors.py
from post_app.forms import PostForm
def post_form(request):
form = PostForm
return {
'post_form': form,
}
base.html
<form method="POST" enctype="multipart/form-data">
{{ post_form|crispy }}
{% csrf_token %}
<button type="submit" class="btn btn-primary">Post</button>
</form>
我希望表单显示在每个页面上,以便用户可以从任何地方提交数据
def PostView(request):
form = PostForm()
if request.method == 'GET':
return render(request, 'base.html', {form:form})
elif request.method == 'POST':
form.save(request.data)
在您的应用程序的 views.py 中,您可以定义此视图,并且您必须在根目录的 urls.py 中为其提供一个 url。所以每次有一个关于 url 的请求,如果方法是 GET,表单将呈现在 base.html 文件上,如果方法是 POST,post将被保存。
按照 N T
的回答,我实现了这个。因此,我必须为视图制作一个 URL 模式,并以 base.html
.
view.py
@login_required
def postsaveview(request):
form = PostForm()
if request.method == 'POST':
form = PostForm(request.POST, request.FILES)
if form.is_valid():
user_obj = form.save(commit=False)
user_obj.user = request.user
user_obj.slug = str(request.user) + str(uuid.uuid4())
user_obj.save()
return HttpResponseRedirect(reverse('profile_app:profile'))
urls.py
urlpatterns = [
path('post-save/', views.postsaveview, name='post-save'),
]
base.html
<form action="{% url "post-save" %}" method="POST" enctype="multipart/form-data">
{{ post_form|crispy }}
{% csrf_token %}
<button type="submit" class="btn btn-primary">Post</button>
</form>