首页 > 解决方案 > 在 Django/Ajax 中使用 html 表单时将 request.user 作为隐藏输入传递

问题描述

有没有办法request.user在. 我的目的是我想用.htmlDjangophotologueUser Foreignkey

class GalleryExtended(models.Model):
    # Link back to Photologue's Gallery model.
    gallery = models.OneToOneField(Gallery, related_name='extended', on_delete=models.CASCADE,)
    user = models.ForeignKey(settings.AUTH_USER_MODEL, related_name="galleries",default=1,on_delete=models.CASCADE)

我使用基于类的视图/Ajax 创建我的画廊

class AjaxableResponseMixin:
    """
    Mixin to add AJAX support to a form.
    Must be used with an object-based FormView (e.g. CreateView)
    """
    def form_invalid(self, form):
        response = super().form_invalid(form)
        if self.request.is_ajax():
            return JsonResponse(form.errors, status=400)
        else:
            return response

    def form_valid(self, form):
        # We make sure to call the parent's form_valid() method because
        # it might do some processing (in the case of CreateView, it will
        # call form.save() for example).
        form.instance.slug = slugify(form.instance.title)
        form.instance.user = self.request.user
        print(form.instance.user)
        response = super().form_valid(form)
        if self.request.is_ajax():
            data = {
                'pk': self.object.pk,
                'status': 'ok'
            }
            return JsonResponse(data)
        else:
            return response

class GalleryCreateView(AjaxableResponseMixin, CreateView):
    model = GalleryExtended
    form_class = GalleryExtendedModelForm
    success_url = reverse_lazy('profiles:photos')

我试图初始化表单:

class GalleryExtendedModelForm(forms.ModelForm):

    class Meta:
       model=GalleryExtended
       fields = ["user"]

    def __init__(self, *args, **kwargs):

        super(GalleryExtendedModelForm, self).__init__(*args, **kwargs)
        self.fields['user'] = request.user
        self.fields['user'].widget = HiddenInput()

在我的模板中:

<form  class="form-group label-floating" id="album-create-form" method="post"  enctype="multipart/form-data">
    {% csrf_token %}
    <label class="control-label">{% trans 'Enter Album Name' %}</label>
    <input class="form-control" name="title" id="title" placeholder="" type="text" >
</form>

$('#album-create-form').submit( function(e){
    e.preventDefault();
    var serializedData = $(this).serialize();

    $.ajax({
            type: 'POST',
            url: "{% url 'galleries:create' %}",
            data: serializedData,
            success: function (response) {

                $("#album-create-form").modal('hide');
                document.getElementById("album-create-form").reset();
                $(document).ajaxStop(function(){
                    window.location.reload();
                });
            },
            error: function (response) {
                // alert the error if any error occured
                alert(response["responseJSON"]["error"]);
            }
    });

});

是否有发送 request.user 的解决方案。谢谢

标签: djangoajax

解决方案


您不必为 request.user 创建隐藏输入,我正在举个例子。

基于类的视图:CreateView

这会将请求用户添加到用户到数据库。

表格.py:

from django import forms
from .models import GalleryExtended


class GalleryExtendedModelForm(forms.ModelForm):
    class Meta:
        model = GalleryExtended
        fields = ['gallery', ]

视图.py:

from django.views.generic import CreateView


class create_view(CreateView):
    success_url = reverse_lazy('profiles:photos')
    template_name = 'app_name/template_name.html'
    form_class = GalleryExtendedModelForm

    def form_valid(self, form):
        form.instance.user = self.request.user
        return super(create_view, self).form_valid(form)

模板.html:

<form method="post" id='album-create-form'>
      {% csrf_token %}
      {{ form }}
      <input type="submit" value="Submit">
</form>

    $('#album-create-form').submit( function(e){
        e.preventDefault();

        $.ajax({
                type: 'POST',
                url: "{% url 'galleries:create' %}",
                data: {
                   'gallery': $('#id_gallery').val() // from form
                },
                success: function (response) {

                    $("#album-create-form").modal('hide');
                    document.getElementById("album-create-form").reset();
                    $(document).ajaxStop(function(){
                        window.location.reload();
                    });
                },
                error: function (response) {
                    // alert the error if any error occured
                    alert(response["responseJSON"]["error"]);
                }
        }); 
    });

推荐阅读