【问题标题】:Dynamic formset problems动态表单集问题
【发布时间】:2012-06-21 02:51:32
【问题描述】:

我需要一些帮助来在 django 中构建动态表单集。我知道需要一些 javascript。我不是 javascript 专家。但我找到了一些示例代码,我正试图让它适应我的特定形式。当我单击添加按钮时,没有任何反应。我不知道如何前进。有什么建议吗?

模型用于参加者活动注册。一个客户可以注册多人参加一个活动。
正在尝试获取添加与会者按钮。

# models.py
class Customer(models.Model):
    event = models.ForeignKey(Event)
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30) 
    address1 = models.CharField(max_length=60) 
    address2 = models.CharField(max_length=60, blank=True) 
    city = models.CharField(max_length=30) 
    state = models.CharField(max_length=2) 
    zipcode = models.CharField(max_length=5) 

class Attendee(models.Model):
    event = models.ForeignKey(Event)
    sponsor = models.ForeignKey(Customer)
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30) 

# forms.py
CustomerFormset = inlineformset_factory(Customer, Attendee, form=AttendeeForm, exclude=('event'), extra=2)

# templates/register.html
<form action="/enroll/register3/{{ event.id }}/" method="post">{% csrf_token %}
<p> Sponsor information: </p>

<table>
  {{ customer }}
</table>
<hr>
<p> Students Attending: </p>
{% for attendee in attendees.forms %}
<div class="formgroup">
  {{ attendee }}
  {% if attendee.nested %}
  {% for formset in attendee.nested %}
  {{ formset.as_table }}
  {% endfor %} 
  {% endif %} 
</div>
{% endfor %}
 <div>
 Nothing happens when 'add_more' is clicked.  ??
 <input type="button" value="Add Attendee" id="add_more">
 <input type="submit" value="Submit">
</div>
</form>

<script> 
    $('#add_more').click(function() { 
        //cloneMore('div.table:last', 'service'); 
        cloneMore('div.table:last', 'formgroup'); 
    }); 

function cloneMore(selector, type) { 
    console.log('cloneMore'); 
    var newElement = $(selector).clone(true); 
    var total = $('#id_' + type + '-TOTAL_FORMS').val(); 
    newElement.find(':input').each(function() { 
        var name = $(this).attr('name').replace('-' + (total-1) + '-','-' + total + '-'); 
        var id = 'id_' + name; 
        $(this).attr({'name': name, 'id': id}).val('').removeAttr('checked'); 
    }); 
    newElement.find('label').each(function() { 
        var newFor = $(this).attr('for').replace('-' + (total-1) + '-','-' + total + '-'); 
        $(this).attr('for', newFor); 
    }); 
    total++; 
    $('#id_' + type + '-TOTAL_FORMS').val(total); 
    $(selector).after(newElement); 
} 

</script> 

【问题讨论】:

    标签: django django-forms inline-formset


    【解决方案1】:

    看起来您从 this question 获取了 javascript,但您没有调整您的 HTML 结构。

    正如我在您的 sn-p 中看到的(看起来它也会产生高度无效的 html,即 div 中的 tr):

    {% for attendee in attendees.forms %}
    <div class="formgroup">
      {{ attendee }}
      {% if attendee.nested %}
      {% for formset in attendee.nested %}
      {{ formset.as_table }}
      {% endfor %} 
      {% endif %} 
    </div>
    {% endfor %}
    

    还有他的:

    {{ serviceFormset.management_form }}
    {% for form in serviceFormset.forms %}
        <div class='table'>
        <table class='no_error'>
            {{ form.as_table }}
        </table>
        </div>
    {% endfor %}
    

    如果您想要完全相同的 javascript 代码,那么您应该具有完全相同的 HTML 结构。您在 JS 中做的第一件事是将 div.table:last 作为选择器传递,但您的 HTML 中没有 div.table。

    最好的办法是尝试自己制作 javascript。作为网页开发者,javascript 会帮到你很多。

    【讨论】:

    • 我什至如何开始调试这些东西?当我单击“添加”按钮时,没有任何反应。我尝试添加一些像 console.log('click'); 这样的 Firebug 内容,但是当我这样做时没有打印出来。
    • 您应该在 firebug 的“脚本”选项卡中放置断点。 getfirebug.com/javascript
    猜你喜欢
    • 2017-01-11
    • 1970-01-01
    • 1970-01-01
    • 2011-09-07
    • 2019-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多