Передача request.user как скрытого ввода при использовании формы html в Django / Ajax - PullRequest
0 голосов
/ 05 февраля 2020

Есть ли способ предварительно заполнить request.user при использовании html форм в Django. Моя цель - создать расширенную галерею photologue с 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)

Я использую Class Based Views / 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. Спасибо

1 Ответ

1 голос
/ 06 февраля 2020

Вам не нужно создавать скрытый ввод для request.user. Я привожу пример.

Представление на основе классов: CreateView

Это добавит пользователя запроса к * 1006. * user в базу данных.

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"]);
                }
        }); 
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...