2016-12-10 1 views
1

Я застрял в своем коде. Нужна помощь.Изменение идентификатора формы django in for loop

Это мой передний конец. Я обрабатываю формы, хранящиеся в «form_list». Проблема заключается в том, что сохраненные формы имеют одинаковый тип и, таким образом, создают поля ввода с одинаковым «id» и одним и тем же «именем».

Это мое мнение: -

@login_required 
def VideoLinkView(request): 
    """view to save the video links """ 
    current_form_list = [] 
    current_form = None 
    if request.method == 'GET': 
     vl = VideoLink.objects.filter(company=CompanyModel.objects.get(owner=request.user)) 
     for link in vl: 
      current_form = VideoLinkForm(link.__dict__) 
      current_form_list.append(current_form) 
     return render(request, "premium/video_link.html", context={'form_list':current_form_list}) 

Это мой HTML шаблон: -

{% for form in form_list %} 
    <div class="form-group"> 
     <label for="id_video_link">Video Link:</label> 
     {{ form.video_link }} 
    </div> 
{% endfor %} 

Как я могу создавать различные "ID" и разные "имя" в каждой итерации цикла For-х тег ввода, автоматически, без знания формы, хранящейся в form_list. Я пробовал {{forloop.counter}}, это не сработало, возможно, я допустил некоторую ошибку. Кроме того, raw python не работает в шаблоне.

Спасибо заранее.

+0

Как же вы пытаетесь forloop.counter: Попробуйте https://gist.github.com/vi3k6i5/764da92b65201b2706a9e6c31b63e850 –

+1

вы можете изменить значение по умолчанию genrated 'id' для каждого экземпляра с помощью' auto_id' аргумент в Конструктор форм –

+0

Я не думаю, что вы можете сделать это, не изменяя способ создания form_list. Правильный способ заключается в использовании 'prefix' при создании экземпляров форм –

ответ

1

Способ, которым вы создаете свои формы, неверен двумя способами. Во-первых, первый позиционный аргумент - для значений, представленных пользователем; прохождение этого аргумента провоцирует проверку, среди прочего. Если вы передаете значения для отображения предварительного заполнения формы, вы должны использовать initial kwarg:

current_form = VideoLinkForm(initial={...dict_of_values...}) 

Однако, даже это не подходит для вашего случая использования здесь. link - пример модели; Вы должны использовать instance kwarg:

current_form = VideoLinkForm(instance=link) 

Теперь, чтобы решить эту проблему, вы просили, вы можете просто передать prefix как я первоначально рекомендовал:

for i, link in enumerate(vl): 
    current_form = VideoLinkForm(instance=link, prefix="link{}".format(i)) 

Однако теперь, когда вы показали все детали, мы можем видеть, что это не лучший подход. У вас есть запрос; поэтому вы должны просто использовать model formset.

from django.forms import modelformset_factory 
VideoLinkFormSet = modelformset_factory(VideoLink, form=VideoLinkForm, queryset=vl) 
current_form_list = VideoLinkFormSet() 
+1

Спасибо, Дэниэл. formet решил мою проблему. –