Django - проверка и сохранение ModelForm с полями editable = false - PullRequest
0 голосов
/ 02 июня 2011

Я прошу прощения за все вопросы, которые я отправляю сегодня, но я в своем уме на этом.

Я пытаюсь сделать вопрос-ответ для видео-сайта, и япытаюсь получить вопрос для отправки через AJAX.

Модель вопроса:

class Question(models.Model):
    user = models.ForeignKey(User, editable=False)
    video = models.ForeignKey(Video, editable=False)
    section = models.ForeignKey(Section, editable=False)
    title = models.CharField(max_length=255)
    description = models.TextField(null=True, blank=True)

ModelForm:

class QuestionForm(ModelForm):
    def __init__(self, video, *args, **kwargs):
        super(QuestionForm, self).__init__(*args, **kwargs)
        if self.instance:
            self.fields['section'].queryset = Section.objects.filter(video=video)

    class Meta:
        model = Question

POST-параметры, отправленные запросом jQuery AJAX (параметр видео добавляется кодом Javascript):

section=6&title=test&description=test&video=1

И, наконец, вот представление, над которым я работаю для обработки отправки:

def question_submit(request):
    u = request.user
    if u.is_authenticated():
        q=QuestionForm(request.POST)

        if q.is_valid():
            logger.debug("YES!")
        else:
            logger.debug("NO!")

        f=q.save(commit=False)
        f.user=u
        f.video_id=int(request.POST['video'])

        f.save()
        return HttpResponse("OK")
    else:
        return JsonResponse({'failed': 'You are not logged in. Try logging in in a new tab, then re-submit your question.'})

Как предложено docs , я сохраняю с помощью commit = false, чтобы я мог изменить объект.

У меня две проблемы:

  1. Когда он достигает q.is_valid (), он выдает ошибку «У объекта QuestionForm нет атрибута cleaned_data».

  2. Если я выну бит q.is_valid (), f.save ()успешно, но он вставляет пустую строку в базу данных.

Всем, кто может помочь, я в долгу перед вами.

Ответы [ 2 ]

2 голосов
/ 02 июня 2011

Вы не передаете видео в представлении:

forms.py

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

views.py

q=QuestionForm(request.POST)

, поскольку видео является позиционным аргументом, я думаю, что оно интерпретирует request.POST как видео?

Вы можете изменить video нааргумент ключевого слова:

def __init__(self, video=None, *args, **kwargs):
    if video:
         ...

как mordi, вы должны проверить, если a) это действительный POST, и b) это ajax-запрос

def question_submit(request):
    if request.method == "POST" and request.is_ajax():
        ... 
0 голосов
/ 02 июня 2011

Похоже, ваш запрос. ПОСТ пуст. Вы уверены, что данные отправляются методом POST ?, отметьте

if request.method == 'POST:

или используйте

q=QuestionForm(request.REQUEST)

для получения данных POST / GET.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...