Django:在一个页面上为每个用户创建一个表单

时间:2014-03-06 08:29:57

标签: python django django-forms

对不起,标题不是很具描述性。背景:我有一个充满参与者的活动。当活动结束时,我想为所有其他参与者留下反馈。

models.py

class Feedback(models.Model):
    action = models.ForeignKey(Action)
    feedback_by = models.ForeignKey(UserProfile, related_name='feedback_by')
    feedback_for = models.ForeignKey(UserProfile, related_name='feedback_for')
    comment = models.CharField(max_length=200)
    no_show = models.BooleanField()
    created = models.DateTimeField()
    modified = models.DateTimeField()

forms.py

class FeedbackFormSet(BaseModelFormSet):
    def add_fields(self, form, index):
        super(FeedbackFormSet, self).add_fields(form, index)
        form.fields['is_checked'] = forms.BooleanField(required=False)  

class FeedbackForm(forms.ModelForm):
    comment = forms.CharField(label=(u"Comment"), widget=forms.Textarea())

    class Meta:
        model = Feedback
        fields = ['comment', 'no_show']

我想创建一个反馈页面,其中每个参与者都会有一个FeedbackForm实例。在进行一些搜索之后,似乎要做到这一点我想要使用FormSet,但是我找不到它的文档非常有用,我似乎找不到任何好的例子。

如果一个formset是要走的路,你们可以帮我一些(基本上是view / formset)入门代码吗?如果没有,你能指出我应该做什么吗?感谢。

编辑:我在下面添加了我的视图和模板代码。

views.py

@login_required
def new_feedback(request, action_id):
    action = get_object_or_404(Action, id=action_id)
    profile = UserProfile.objects.get(user_id=request.user.id)  
    participants = all_info_many_profiles(action.participants.filter(~Q(id=profile.id)))

    fbformset = modelformset_factory(Feedback, form=FeedbackForm, formset=FeedbackFormSet)

    if request.method == 'POST':
        formset = fbformset(request.POST, request.FILES, queryset=action.participants.filter(~Q(id=profile.id)))
        if formset.is_valid():
            formset.save()
        else:
            print formset.errors
    else:
        formset = fbformset(queryset=action.participants.filter(~Q(id=profile.id)))

    return render(request, 'app/new_feedback.html', 
                 {'action': action, 'participants': participants, 'formset': formset}

new_feedback.html

{% block body_block %}
<h1>Leave Feedback</h1>  

    {% for participant in participants %}
        <li>{{ participant.username }}</li>
    {% endfor %}

    <form method="post" action="">
        {% csrf_token %}
        {{ formset.management_form }}
        {% for form in formset %}
            {{ form.as_p }} <br />
        {% endfor %}
        <input type="submit" name="submit" value="Submit Feedback" />
    </form>
{% endblock %}

我想要实现的是将一个表单与参与者列表(或查询集)中的每个用户相关联。我目前所拥有的表格比我想要的还多一个(例如,当我列出每个用户时,我会看到3个名字,但有4个表格example),我不知道用户/表单是否或如何相关

这个想法是feedback_for字段将自动获取其值,即在我将要执行的视图中:

if formset.is_valid():
    for form in formset:
        a = form.save(commit=false)
        a.feedback = participant
        a.save()

最重要的是,我添加了一个额外的字段“is_checked”,用于指定我是否为该用户留下反馈。完整功能示例:

user1 [X] is_checked ...其余形式

user2 [] is_checked ...其余形式

user3 [X] is_checked ...其余形式

然后当我点击提交时,它将在Feedback表中创建两个新条目,一个用于user1,一个用于user3

0 个答案:

没有答案