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