2015-06-14 1 views
3

У меня есть форма, «результаты», где одно из полей «subjectID» - это много-ко многим потому что для каждого предмета есть более одного результата. Я хочу, чтобы одна из кнопок отправки позволяла мне сохранять то, что я ввела, а затем перенаправить в ту же форму, теперь несвязанной, за исключением того, что поле «subjectID» много-ко-многим остается таким же, поэтому я могу ввести больше результатов для этого объекта ,«сохранить и добавить еще» в Django (не admin): отправить затем предварительно заполнить одно поле формы

Edit: Я дал понять, что я хотел экземпляр что я выбранный в поле subjectID остаться тем же самым. Я отправил код ниже, на самом деле, кажется, работает для меня

из models.py

class ResultsForm(forms.Modelform): 
    class Meta: 
     model = models.Results 
     fields = ['subjectID', # this is the field want 
     # to populate the form with when I "save and add another" 
       'slideNum', # IntegerField 
       'resultType' ] # ForeignKey 

из views.py

def addResults(request): 
    if request.method == 'POST' 
     form = ResultsForm(request.POST) 
     if form.is_valid(): 
      form.save() 
     if 'Save_and_add_another' in request.POST: 
      subjectID = form.fields['subjectID'] 
      prepop = {'subjectID' : subjectID} 
      form = ResultsForm(initial=prepop) 
      return render(request, 'slideAdmin/addResults.html', {'form': form}) 
     elif 'Save_and_return' in request.POST: 
      return HttpResponseRedirect('/home/')  
    else: 
     form = ResultsForm() 
    return render(request, 'slideAdmin/addResults.html', {'form': form}) 

Прямо сейчас, когда я нажимаю на «сохранить и добавить еще "с моей addResults формы, я получаю эту ошибку:

TypeError at /slidebox/addResults 

'ModelMultipleChoiceField' object is not iterable 

, который происходит при рендеринге {{form.as_p} } в шаблоне.

Edit: изменения я сделал в views.py

if 'Save_and_add_another' in request.POST: 
     subjectID = form.cleaned_data.get('subjectID') 
     form = ResultsForm(initial={'subjectID': subjectID}) 
     return render(request, 'slideAdmin/addResults.html', {'form': form}) 

Насколько я могу судить, это изменение работает. Еще раз спасибо

ответ

0

Вы всегда должны использовать form.cleaned_data.get('subjectID') против вытягивания поля непосредственно из данных сообщения. Вам нужно передать список pk для поля M2M.

Ваше мнение может также использовать прикосновение очистки:

from django.core.urlresolvers import reverse 


def addResults(request): 
    form = ResultsForm(request.POST or None) 

    if request.method == 'POST' and form.is_valid(): 
     form.save() 

     if 'Save_and_add_another' in request.POST: 
      subjectID = form.cleaned_data.get('subjectID', []) 
      if subjectID: 
       subjectID = subjectIDs.split(',') 
      form = ResultsForm(initial={'subjectID': subjectID}) 

     elif 'Save_and_return' in request.POST: 
      return HttpResponseRedirect(reverse('home')) # don't hard code 

    return render(request, 'slideAdmin/addResults.html', {'form': form}) 
+1

Это сработало, спасибо, и я удалил жестко запрограммированные URL-адреса. Я согласен, что ваши изменения делают код более сукцином, но мне нравится более верный способ - я уверен, что вы понимаете различия, но для других людей, которые могли бы это увидеть, вот хорошая дискуссия: [http://www.pydanny.com /the-easy-form-views-pattern-controversy.html](http://www.pydanny.com/the-easy-form-views-pattern-controversy.html) – NickleDave

+0

Я не видел эту статью, но прочитает это сразу. – Brandon

+0

Если вы используете Django 1.5 или выше, шаблон «easy forms view» не должен отрицательно влиять на ваш код, но в любом случае это прекрасно. Всегда есть случаи, когда мне нужно делать что-то по-другому в GET и использовать стандартный шаблон. – Brandon

0

Я не уверен, что если вы будете в состоянии держать форму Unbound при инициализации.

Ваш form.fields - это упорядоченный dict объектов django.forms.fields. Вам просто нужны идентификаторы, а не вся другая информация, которая встречает его.

Получить данные прямо из словаря POST.

subjectID = request.POST.get('subjectID', '') 

Если это действительно много для многих моделей. Вы должны убедиться, что данные правильно настроены для инициализации.

# We have to special-case M2Ms as a list of comma-separated PKs. 
if isinstance(f, models.ManyToManyField): 
    initial[k] = initial[k].split(",") 

Вот метод инициализации из исходного Джанго кода администратора (или, как я называю это мой супер подробный и сложный Джанго шпаргалку, я педантичный)

def get_changeform_initial_data(self, request): 
    """ 
    Get the initial form data. 
    Unless overridden, this populates from the GET params. 
    """ 
    initial = dict(request.GET.items()) 
    for k in initial: 
     try: 
      f = self.model._meta.get_field(k) 
     except FieldDoesNotExist: 
      continue 
     # We have to special-case M2Ms as a list of comma-separated PKs. 
     if isinstance(f, models.ManyToManyField): 
      initial[k] = initial[k].split(",") 
    return initial 

Некоторые PEP8 нонсенс, а

классы - это верблюжий корпус ex: class MyAwesomeClass(object): все остальное внизу с подчеркиванием. ex: awesome_id = awesome1245

Удачи !!

+0

Спасибо за четкое объяснение - дадут вам очки, если можно. Я знаю, что стандарт PEP8 является символом подчеркивания, я просто ненавижу, что провел свою жизнь, набрав лишние символы. – NickleDave

+0

Спасибо. Рад, что это полезно. Мне нравится этот сайт и я хочу вернуть его. – Luke

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