Нетипичный объект не имеет атрибута is_ajax - PullRequest
0 голосов
/ 05 января 2019

Я использую Django-bootstrap-modal-forms в моем проекте. Но я хочу немного изменить настройки и добавил поле Upload и Author в качестве внешнего ключа. Если я делаю из библиотеки, она работает нормально. Но здесь я получаю Nonetype object has no attribute is_ajax. Я не знаю, почему это Nonetype, хотя я вошел в систему.

Модель:

class File(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    visible_to_home = models.ManyToManyField(Home, blank=True)  # when none visible to all home
    visible_to_company = models.ManyToManyField(Company, blank=True)  
# when none visible to all company
# To determine visibility, check if vtc is none or include company of user and if true, check same for home
    created_date = models.DateTimeField(auto_now=True)
    published = models.BooleanField(default=True)
    upload = models.FileField(blank=True, null=True, upload_to=update_filename)
    title = models.CharField(max_length=225, blank=True, null=True)
    description = models.TextField(blank=True, null=True)

Формы

class FileForm(PopRequestMixin, CreateUpdateAjaxMixin, forms.ModelForm):
class Meta:
    model = File
    fields = ('title', 'description', 'upload')

View

class FileCreateView(PassRequestMixin, SuccessMessageMixin,
             CreateView):
    template_name = 'file/upload-file.html'
    form_class = FileForm
    success_message = 'File was uploaded successfully'
    success_url = reverse_lazy('home')

def post(self, *args, **kwargs):
    """
    Handle POST requests: instantiate a form instance with the passed
    POST variables and then check if it's valid.
    """
    #form = self.get_form()
    form = self.form_class(self.request.POST, self.request.FILES)
    if self.request.method == 'POST':
        if form.is_valid():
            file = form.save(commit=False)
            file.upload = form.cleaned_data['upload']
            file.author = User.objects.get(pk=self.request.user.pk)
            file.save()
            return self.form_valid(form)
        else:
            return self.form_invalid(form)

Здесь, в методе представления post, если я использую form = self.get_form() вместо form = self.form_class(self.request.POST, self.request.FILES), тогда возникает проблема с формой Django, сохраняющей одновременно отправляемый запрос дважды .

home.html

{% block extrascripts %}
<script type="text/javascript">
  $(function () {
     $(".upload-file").modalForm({formURL: "{% url 'file-upload' %}"});
  });
 </script>
{% endblock extrascripts %}

Трассировка назад:

File "/home/bishwa/PycharmProjects/sharefile/env/lib/python3.6/site-packages/django/core/handlers/exception.py", line 35, in inner
response = get_response(request)
File "/home/bishwa/PycharmProjects/sharefile/env/lib/python3.6/site-packages/django/core/handlers/base.py", line 128, in _get_response
response = self.process_exception_by_middleware(e, request)
File "/home/bishwa/PycharmProjects/sharefile/env/lib/python3.6/site-packages/django/core/handlers/base.py", line 126, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/usr/lib/python3.6/contextlib.py", line 52, in inner
return func(*args, **kwds)
File "/home/bishwa/PycharmProjects/sharefile/env/lib/python3.6/site-packages/django/views/generic/base.py", line 69, in view
return self.dispatch(request, *args, **kwargs)
File "/home/bishwa/PycharmProjects/sharefile/env/lib/python3.6/site-packages/django/views/generic/base.py", line 89, in dispatch
return handler(request, *args, **kwargs)
File "/home/bishwa/PycharmProjects/sharefile/sharefile/file/views.py", line 103, in post
file = form.save(commit=False)
File "/home/bishwa/PycharmProjects/sharefile/env/lib/python3.6/site-packages/bootstrap_modal_forms/mixins.py", line 40, in save
if not self.request.is_ajax():
AttributeError: 'NoneType' object has no attribute 'is_ajax'

[06 / Jan / 2019 00:06:30] "POST / upload / file / HTTP / 1.1" 500 110437

В соответствии с библиотекой, которую я использую, написано On submit the form is POSTed via AJAX request to formURL Я думаю, что отследил ошибку, то есть мне нужно сделать ajax-запрос, когда в функции post вызывается метод file = form.save(commit=False) и file.save(). У вас есть идеи, как я могу это сделать?

Ответ: вот наконец-то я решил:

class FileForm(PopRequestMixin, CreateUpdateAjaxMixin, forms.ModelForm):
class Meta:
    model = File
    fields = ('title', 'description', 'upload')

def save(self, commit=False):

    if not self.request.is_ajax():
        instance = super(CreateUpdateAjaxMixin, self).save(commit=commit)
        instance.author = User.objects.get(pk=self.request.user.pk)
        instance.save()
    else:
        instance = super(CreateUpdateAjaxMixin, self).save(commit=False)

    return instance

Метод save переопределен из CreateUpdateAjaxMixin, и я удалил метод post в представлении.

...