2014-01-07 3 views
0

Я играю с django-survey из jessykate (https://github.com/jessykate/django-survey) и изменяет models.py. Теперь метод save() больше не работает, и я не понимаю, почему это так.ModelForm save() не работает после смены модели

models.py (см комментарий #)

class Response(models.Model): 
    ''' 
    a response object is just a collection of questions and answers with a 
    unique interview uuid 
    ''' 
    created = models.DateTimeField(auto_now_add=True) 
    updated = models.DateTimeField(auto_now=True) 
    survey = models.ForeignKey(Survey) 
    # interviewer = models.CharField('Name of Interviewer', max_length=400) 
    # interviewee = models.CharField('Name of Interviewee', max_length=400) 
    # conditions = models.TextField('Conditions during interview', blank=True, null=True) 
    # comments = models.TextField('Any additional Comments', blank=True, null=True) 
    interview_uuid = models.CharField("Interview unique identifier", max_length=36) 

    def __unicode__(self): 
     return ("response %s" % self.interview_uuid) 

views.py (оригинал)

def SurveyDetail(request, id): 
    survey = Survey.objects.get(id=id) 
    category_items = Category.objects.filter(survey=survey) 
    categories = [c.name for c in category_items] 
    print 'categories for this survey:' 
    print categories 
    if request.method == 'POST': 
     form = ResponseForm(request.POST, survey=survey) 
     if form.is_valid(): 
      response = form.save() 
      return HttpResponseRedirect("/confirm/%s" % response.interview_uuid) 
    else: 
     form = ResponseForm(survey=survey) 
     print form 
     # TODO sort by category 
    return render(request, 'survey.html', {'response_form': form, 'survey': survey, 'categories': categories}) 

forms.py (см комментарий #)

class ResponseForm(models.ModelForm): 
    class Meta: 
     model = Response  
    # fields = ('interviewer', 'interviewee', 'conditions', 'comments') 

[...] 

def save(self, commit=True): 
     ''' save the response object ''' 
     response = super(ResponseForm, self).save(commit=False) 
     response.survey = self.survey 
     response.interview_uuid = self.uuid 
     response.save() 

     ''' 
      create an answer object for each question and associate it with this 
      response. 
      ''' 
     for field_name, field_value in self.cleaned_data.iteritems(): 
      if field_name.startswith("question_"): 
       # warning: this way of extracting the id is very fragile and 
       # entirely dependent on the way the question_id is encoded in the 
       # field name in the __init__ method of this form class. 
       q_id = int(field_name.split("_")[1]) 
       q = Question.objects.get(pk=q_id) 

       if q.question_type == Question.TEXT: 
        a = AnswerText(question = q) 
        a.body = field_value 
       elif q.question_type == Question.RADIO: 
        a = AnswerRadio(question = q) 
        a.body = field_value 
       elif q.question_type == Question.SELECT: 
        a = AnswerSelect(question = q) 
        a.body = field_value 
       elif q.question_type == Question.SELECT_MULTIPLE: 
        a = AnswerSelectMultiple(question = q) 
        a.body = field_value 
       elif q.question_type == Question.INTEGER: 
        a = AnswerInteger(question = q) 
        a.body = field_value 
       print "creating answer to question %d of type %s" % (q_id, a.question.question_type) 
       print a.question.text 
       print 'answer value:' 
       print field_value 
       a.response = response 
       a.save() 
     return response 

Так что же происходит когда я сохраняю опрос, я получу ту же самую страницу со всеми моими вводами вместо страницы подтверждения.

Любые подсказки?

+0

Похоже, ваша форма недействительна, поэтому, когда она попадает в 'if form.is_valid()' условно, она пропускает ее (chuck in a assert для подтверждения этого), и поэтому метод save() даже не называемый. Если это действительно неверная форма, вам нужно проверить ошибки формы, чтобы узнать, почему. – ptr

+0

Проблема заключается в 'fields = ('интервьюер', 'интервьюируемый', 'условия', 'комментарии')'. Если я добавлю интервьюера и собеседника обратно в models.py и задаю поля в forms.py, это сработает. Являются ли 'fields' обязательными в forms.py? –

+0

«Я добавляю это, и проблема уходит» не означает, что проблема сосредоточена вокруг строки, которую вы добавляете/удаляете, это всего лишь показатель того, с чего начать искать. Я хотел знать ошибки формы, потому что без обратной трассировки, это самая описательная информация, которую вы получите, почему форма не использует 'save()'. Я добавлю более подробный ответ в качестве ответа. – ptr

ответ

0

В настоящее время вы редактируете сторонний код в своем проекте. Трудность, с которой вы сталкиваетесь, - это быстрый урок (который мы все узнаем) в том, почему это плохая идея. От взгляда на ваш код вы, кажется, просто хотите удалить некоторые поля из модели Response. Лучшим решением этой проблемы является создание собственной модели MyResponse и ее использование, а не редактирование источника стороннего приложения.

Если вы настаиваете на том, чтобы использовать свои модификации (не настаивайте на том, чтобы использовать ваши модификации), то вам нужно определить, почему form.is_valid() - False (Это предположение, «save() не работает» очень расплывчато, но вы не отправили трассировку ошибок, поэтому я предполагаю, что их нет). Ваша форма содержит ошибки в нем, и если вы обращаетесь к ним:

for field, errors in form.errors.items(): 
    print field 
    for error in errors: 
     print error 

Тогда они дадут вам лучшее представление о том, что происходит.

Edit: От ошибок вы вывешенные вы можете увидеть, где проблема, вы звоните form.is_valid(), когда форма отсутствует атрибут survey, поэтому is_valid() вычисляет значение False и метод вашей формы сохранения() никогда даже не вызывается. установите form.survey = survey, прежде чем позвонить form.is_valid() и посмотрите, что произойдет.

+0

Без ответа на вопросы: 'категории для этого опроса: [u'Test ', u'Neuland'] question_2 Это поле обязательно для заполнения. question_1 Это поле обязательно для заполнения. interview_uuid Это поле обязательно для заполнения. Это поле обязательно для заполнения. [08/Jan/2014 04:57:30] "POST/survey/1/HTTP/1.1" 200 4211' С вопросом ответил: 'категории для данного исследования:. [u'Test 'u'Neuland'] interview_uuid Это поле обязательно обследование Это поле required.' –

+0

обновлено ответ – ptr

+0

По-прежнему то же самое. Я думал, что опрос уже передан форме 'form = ResponseForm (request.POST, survey = survey)' –

Смежные вопросы