【问题标题】:Passing request.user as hiddeninput while using html form in Django/Ajax在 Django/Ajax 中使用 html 表单时将 request.user 作为隐藏输入传递
【发布时间】:2020-02-04 21:04:02
【问题描述】:

有没有办法在Django 中使用html 表单时预填充request.user。我的目的是我想用UserForeignkey 创建一个photologue 扩展画廊。

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 的解决方案。谢谢

【问题讨论】:

    标签: django ajax


    【解决方案1】:

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

    基于类的视图:CreateView

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

    forms.py:

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

    views.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"]);
                    }
            }); 
        });
    

    【讨论】:

      猜你喜欢
      • 2019-09-29
      • 2017-12-24
      • 2020-05-08
      • 2021-02-15
      • 2021-05-30
      • 2023-03-03
      • 2022-10-06
      • 2017-11-16
      • 2021-01-05
      相关资源
      最近更新 更多