2013-08-05 2 views
3

У меня возникли проблемы с отображением встроенного набора форм с несколькими экземплярами экземпляра. Я хочу список всех Owner и встроенный набор всех их Pet, все на одной странице.Вызов нескольких экземпляров одновременно для встроенных FormSets

Код ниже работает, но называет 1 объект владельца за раз. Какие-либо предложения?

Это новый вопрос, который пришел из: Django DatabaseError "more than one row returned by a subquery used as an expression" Editable related fields to object

models.py

class Teacher(models.Model): 
    teacher = models.CharField(max_length=300) 

class Owner(models.Model): 
    relevantteacher = models.ForeignKey(Teacher)  
    owner = models.CharField(max_length=300) 

class PetName(models.Model): 
    relevantowner = models.ForeignKey(Owner) 
    pet_name = models.CharField(max_length=50) 

forms.py

class OwnerForm(forms.ModelForm): 
    class Meta: 
     model = Owner 

PetNameFormSet = inlineformset_factory(Owner, 
    PetName, 
    can_delete=False, 
    extra=3, 
    form=OwnerForm) 

views.py

def petname(request, teacher_id): 
    teacher = get_object_or_404(Teacher, pk=teacher_id) 

    owners = Owner.objects.filter(relevantteacher=teacher_id) 
    owner = owners[0] 

    if request.method == "POST": 
     petNameInlineFormSet = PetNameFormSet(request.POST, request.FILES, instance=owner) 

     if petNameInlineFormSet.is_valid(): 
     petNameInlineFormSet.save() 

     return HttpResponseRedirect(reverse('success')) 

    else: 
     petNameInlineFormSet = PetNameFormSet(instance=owner) 

    context = {'teacher': teacher, 'owner': owner, 'petNameInlineFormSet' : petNameInlineFormSet} 
    return render(request, 'petname.html', context) 

HTML petname.html

{% load url from future %} 
<form class="petname_form" action="{% url "petname" teacher.id %}" method="post">{% csrf_token %} 
    {{ teacher }} 
    {{ owner.as_table }} 
    {{ petNameInlineFormSet.as_table }} 
</form> 

Update

HTML

{% for owner_form in owner_forms %} 
    <form class="petname_form" action="{% url "petname" teacher.id %}" method="post">{% csrf_token % 
    {% for o in owners %} 
     {{o.owner}} has pets:<br/> //owner is the PK of the Owner model 
     {{ owner_forms.relevantteacher }} 
     {{ owner_forms.as_table }} 
     {{ owner_forms.inline_form.as_table }} 
    {% endfor %} 
    </form> 
+0

Пожалуйста, не используйте заголовок вопроса, чтобы пометить вопрос; вместо этого используйте систему маркировки. –

ответ

1

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

Вот полу псевдокод пример, основанный на вашем views.py для достижения вышеупомянутых:

owner_forms = [] 

if request.method == "POST": 
    for owner in owners: 
     #passing instance here may yeild unexpected behavior; django is aware of instance based on request.POST data. 
     owner_form = PetNameFormSet(request.POST, request.FILES) 
     owner_forms.append(owner_form) 

     if petNameInlineFormSet.is_valid(): 
      petNameInlineFormSet.save() 

else: 
    for owner in owners: 
     owner_form = PetNameFormSet(instance=owner) 
     owner_forms.append(owner_form) 

context['owner_forms'] = owner_forms 

Теперь, делают каждую форму в owner_forms:

{% for owner_form in owner_forms %} 
    <form class="petname_form" action="{% url "petname" teacher.id %}" method="post">{% csrf_token %} 
     {% refer to the teacher object associated with the object the form is generated on %} 
     {{ owner_form.relevantteacher }} 
     {{ owner_form.as_table }} 
     {{ owner_form.inline_form.as_table }} 
    </form> 
{% endfor %} 

Другие рекомендации:

  1. max_length=300 является проблематичным в зависимости от используемой базы данных. Общее правило состоит в том, чтобы ограничить CharField до 255 символов. Все, что больше 255, должно быть TextField.
  2. Django позволяет лениво ссылаться на ForeignKeys, заменять экземпляры models.ForeignKey(Model) на models.ForeignKey("Model"), чтобы предотвратить потенциальные условия гонки в будущем.
+0

Спасибо pygeek. Я внесла изменения в мой view.py и html-код, но у меня возникли проблемы с отображением HTML. Я обновляю свой исходный вопрос с помощью нового кода, но по существу {{owner_forms}} не выполняет рендеринг. Любой совет? – nlr25

+0

Кроме того, есть ли причина, по которой существует цикл for вне метки

? Там будет только 1 учитель на страницу, но учитель будет иметь несколько владельцев. У владельца будет несколько ассоциированных имен домашних животных (это встроенный). – nlr25

+0

Я думаю, что вы, возможно, неправильно вызвали экземпляр в предложении else. Вы имели в виду владельцев?Если я помещаю владельцев в экземпляр, я получаю ошибку «более одной строки, возвращаемой подзапросом, используемым как выражение», чего я хочу избежать – nlr25

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