如何在 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>