在Django/Ajax中使用html表单时将request.user作为hiddeninput传递 [英] Passing request.user as hiddeninput while using html form in Django/Ajax

查看:65
本文介绍了在Django/Ajax中使用html表单时将request.user作为hiddeninput传递的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

有没有一种方法可以在 Django 中使用 html 表单时预填充 request.user .我的目的是要使用 User Foreignkey 创建一个 photologue 扩展图库.

  class GalleryExtended(models.Model):#链接回到Photologue的Gallery模型.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创建我的画廊

  AjaxableResponseMixin类:"Mixin将AJAX支持添加到表单.必须与基于对象的FormView一起使用(例如CreateView)"def form_invalid(自我,形式):响应= super().form_invalid(form)如果self.request.is_ajax():返回JsonResponse(form.errors,status = 400)别的:返回响应def form_valid(自我,形式):#我们确保调用父级的form_valid()方法,因为#它可能会做一些处理(对于CreateView,它将#例如调用form.save().form.instance.slug = slugify(form.instance.title)form.instance.user = self.request.user打印(form.instance.user)响应= super().form_valid(form)如果self.request.is_ajax():数据= {'pk':self.object.pk,'状态':'确定'}返回JsonResponse(data)别的:返回响应类GalleryCreateView(AjaxableResponseMixin,CreateView):型号= GalleryExtendedform_class = GalleryExtendedModelFormsuccess_url = reverse_lazy('profiles:photos') 

我试图初始化表格:

  class GalleryExtendedModelForm(forms.ModelForm):类Meta:型号=图库扩展字段= [用户"]def __init __(self,* args,** kwargs):超级(GalleryExtendedModelForm,self).__ init __(* args,** kwargs)self.fields ['user'] = request.userself.fields ['user'].widget = HiddenInput() 

并在我的模板中:

 < form class ="form-group label-floating" id =相册创建表单" method ="post" enctype ="multipart/form-data">{%csrf_token%}< label class ="control-label"> {%trans'输入专辑名称'%}</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({输入:"POST",url:"{%url'galleries:create'%}",数据:serializedData,成功:功能(响应){$(#album-create-form").modal('hide');document.getElementById(相册创建表格").reset();$(document).ajaxStop(function(){window.location.reload();});},错误:功能(响应){//如果发生任何错误,则警告该错误alert(response ["responseJSON"] ["error"]);}});}); 

是否存在用于发送request.user的解决方案.谢谢

解决方案

您不必为request.user创建隐藏的输入.

基于类的视图:CreateView

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

forms.py:

Django导入表单中的

 从.models import GalleryExtended类GalleryExtendedModelForm(forms.ModelForm):类Meta:型号= GalleryExtended栏位= ['gallery',] 

views.py:

从django.views.generic导入

 导入CreateView类create_view(CreateView):success_url = reverse_lazy('profiles:photos')template_name ='app_name/template_name.html'form_class = GalleryExtendedModelFormdef form_valid(自我,形式):form.instance.user = self.request.user返回super(create_view,self).form_valid(form) 

template.html:

 < form method ="post" id ='相册创建格式'>{%csrf_token%}{{ 形式 }}<输入type ="submit" value =提交"></form>$('#album-create-form').submit(function(e){e.preventDefault();$ .ajax({输入:"POST",url:"{%url'galleries:create'%}",数据: {'gallery':$('#id_gallery').val()//来自表单},成功:功能(响应){$(#album-create-form").modal('hide');document.getElementById(相册创建表格").reset();$(document).ajaxStop(function(){window.location.reload();});},错误:功能(响应){//如果发生任何错误,则警告该错误alert(response ["responseJSON"] ["error"]);}});}); 

Is there a way to prepopulate request.user while using html forms in Django. My purpose is I want to create a photologue extended gallery with a User 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)

I use Class Based Views/Ajax to create my Gallery

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')

I tried to initialize form:

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()

and in my template:

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

});

Is there a solution for sending request.user. Thanks

解决方案

You don't have to create hidden input for request.user I'm giving example.

Class Based View: CreateView

This will add request user to user to database.

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)

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

这篇关于在Django/Ajax中使用html表单时将request.user作为hiddeninput传递的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆