- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我遇到错误 django.forms.utils.ValidationError: ['ManagementForm data is missing or has been tampered with']
,但它只发生在测试我的代码时。当使用真正的 POST 请求呈现实际网页时,它不会抛出此错误。
我有一个名为 Position 的模型,表单集由其候选对象组成。所以对于一个特定的职位,我可能有 4 个候选人。
模型.py
class Candidate(models.Model):
user = models.ForeignKey(User, related_name="candidate")
votes = models.PositiveIntegerField(verbose_name="Antall stemmer", blank=True, default=0)
class Position(models.Model):
# Candidates running for position
candidates = models.ManyToManyField(Candidate, blank=True, related_name="positions")
# Number of people voting
number_of_voters = models.PositiveIntegerField(default=0, verbose_name="Antall stemmesedler avgitt")
表单.py
class AddPrevoteForm(forms.ModelForm):
class Meta:
model = Position
fields = ['number_of_voters']
class AddPreVoteToCandidateForm(forms.ModelForm):
class Meta:
model = Candidate
fields = ['votes']
def __init__(self, *args, **kwargs):
super(AddPreVoteToCandidateForm, self).__init__(*args, **kwargs)
self.fields['votes'].label = self.instance.user.get_full_name()
View .py
@permission_required('elections.add_election')
@login_required
def admin_register_prevotes(request, pk):
# Fetch position
position = get_object_or_404(Position, pk=pk)
# For for editing total number of people prevoting
prevote_form = AddPrevoteForm(request.POST or None, instance=position)
# Form for adjusting individual candidate's votes
CandidateFormSet = modelformset_factory(
Candidate, form=AddPreVoteToCandidateForm, extra=0
)
formset = CandidateFormSet(
request.POST or None,
queryset=position.candidates.all()
)
if request.method == 'POST':
if formset.is_valid() and prevote_form.is_valid():
for form in formset:
# Increment both candidate and positions votes
candidate_pk = form.instance.pk
candidate = Candidate.objects.get(pk=candidate_pk)
old_votes = candidate.votes
new_votes = form.cleaned_data['votes']
position.total_votes += (new_votes - old_votes)
form.save()
prevote_form.save()
return redirect(reverse(
'elections:admin_register_candidates',
kwargs={'pk': position.id}
))
context = {
'prevote_form': prevote_form,
'candidate_formset': formset,
'position': position
}
return render(
request, 'elections/admin/admin_add_prevotes.html',
context
)
和模板
<form method="POST">{% csrf_token %}
{{ candidate_formset.management_form }}
{% for candidate_form in candidate_formset %}
<div>
{{ candidate_form }}
</div>
{% endfor %}
{{ prevote_form }}
<div>
<input class="button is-success" type="submit" value="Add prevotes!"></input>
</div>
</form>
来自模板的结果 formset
如下所示:
<input type="hidden" name="form-TOTAL_FORMS" value="4" id="id_form-TOTAL_FORMS" /><input type="hidden" name="form-INITIAL_FORMS" value="4" id="id_form-INITIAL_FORMS" /><input type="hidden" name="form-MIN_NUM_FORMS" value="0" id="id_form-MIN_NUM_FORMS" /><input type="hidden" name="form-MAX_NUM_FORMS" value="1000" id="id_form-MAX_NUM_FORMS" />
<tr><th><label for="id_form-0-votes">Sindre Bakke:</label></th><td><input type="number" name="form-0-votes" value="3" min="0" id="id_form-0-votes" /><input type="hidden" name="form-0-id" value="1" id="id_form-0-id" /></td></tr> <tr><th><label for="id_form-1-votes">Christopher Massey:</label></th><td><input type="number" name="form-1-votes" value="2" min="0" id="id_form-1-votes" /><input type="hidden" name="form-1-id" value="2" id="id_form-1-id" /></td></tr> <tr><th><label for="id_form-2-votes">Ann Green:</label></th><td><input type="number" name="form-2-votes" value="0" min="0" id="id_form-2-votes" /><input type="hidden" name="form-2-id" value="3" id="id_form-2-id" /></td></tr> <tr><th><label for="id_form-3-votes">Michelle Murray:</label></th><td><input type="number" name="form-3-votes" value="0" min="0" id="id_form-3-votes" /><input type="hidden" name="form-3-id" value="4" id="id_form-3-id" /></td></tr>
这就是我尝试以下测试的原因(post_data
中的前四个来自 management_form
)
@pytest.mark.django_db
def test_add_pre_votes_to_candidate(
client, create_admin_user,
create_open_election_with_position_and_candidates):
admin = create_admin_user
client.login(username=admin.username, password='defaultpassword')
election = create_open_election_with_position_and_candidates
position = election.positions.all().first()
number_of_candidates = position.candidates.all().count()
candidate = position.candidates.all().first()
post_data = {
'form-TOTAL_FORMS:': '4',
'form-INITIAL_FORMS': '4',
'form-MIN_NUM_FORMS': '0',
'form-MAX_NUM_FORMS': '1000',
'form-0-votes': '3',
'form-0-id': 1,
'form-1-votes': '2',
'form-1-id': 2,
'form-2-votes': '0',
'form-2-id': 3,
'form-3-votes': '0',
'form-3-id': 4,
'number_of_voters': '0'
}
client.post(
reverse(
'elections:admin_register_prevotes',
kwargs={'pk': position.id}
),
data=post_data
)
如有任何帮助,我们将不胜感激!
最佳答案
这通常是由于管理表单存在一些问题。post_data
中似乎有错字, 'form-TOTAL_FORMS:'
有一个额外的 :
在字符串的末尾。
此外,请注意单元测试中的隐式主键。取决于提供 Candidates
的固定装置的实现对象,它们在数据库中的 ID 可能并不总是从 1,2,.. 等开始。
关于python - 手动填充 modelformset Django 进行测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53466445/
我的问题类似于 Django Passing Custom Form Parameters to Formset 我有这些课 class Game(models.Model): home_te
对于我的 Django 项目,我在模板中渲染模型表单集 election_formset = modelformset_factory(Election, except=('Complete',),
Django 文档没有很好地记录这个主题。事实上,他们在文档中唯一的引用是这一段: How to work with ModelForm and ModelFormSet WizardView.ins
我在一页上有两个表单,每个表单都有自己的提交按钮。使用 JS 脚本,我可以为这两个表单中的每一个动态添加一个新的表单集。我面临的情况是,我可以为页面上首先显示的表单添加任意数量的新表单,并且所有表单都
我现在很绝望,我想不通。对我来说这应该很容易做到,但我还没有找到任何解释这一点的答案。 两个模型之间没有外键: class Employee(models.Model): surname =
我无法使用正确的代码,但我发现了比萨饼/配料问题并且它很接近,所以我正在修改它以提出我的问题。 Django ModelForm for Many-to-Many fields 我们有很棒的披萨和浇头
我正在编写自定义模型表单集。我需要按字段“排序”的值对表单进行排序。我在子表单集类中重载了 BaseFormSet 的 __iter__ 方法。 我的类继承自BaseFormSet: class So
在 Django ModelForm 中,您可以更改字段的小部件类型,如下所示: class EntryForm(ModelForm): entity = forms.CharField()
我有一个在 View 中创建的模型集,如下所示: CarpoolFamilyInviteModelFormset = modelformset_factory(CarpoolFamilyInv
我有一个问题,需要在同一页面上提供多个模型支持的表单。我了解如何使用单个表单执行此操作,即只需创建两个表单,将它们称为不同的名称,然后在模板中使用适当的名称。 现在,您究竟如何扩展该解决方案以使用模型
我想使用 Django (1.4) modelformset,其中加载表单集时,表单将按模型中的 exam_date 字段进行排列。为此,我创建了以下简单的 BaseModelFormSet clas
我有一个由 inlineformset_factory 创建的 inlineformset。inlineformset 字段之一是 DATE 字段,我想添加一个日历小部件。 我该如何设置这个小部件?
我遇到错误 django.forms.utils.ValidationError: ['ManagementForm data is missing or has been tampered with
我只是想澄清一下。我正在处理 Django Form Wizard documentation 在文档中,它谈到表单向导能够与 ModelForm 和 ModelFormSet 一起“工作”。我想澄清
我什么时候应该使用 Form,什么时候使用 ModelForm?另外,我应该什么时候使用 FormSet,什么时候使用 ModelFormSet?似乎我可以用常规的 Form/FormSet 做任何事
将我的代码精简到最少后,它仍然无法工作。我总是得到提示: (Hidden field id) Select a valid choice. That choice is not one of the
我正在重写我们应用程序的很大一部分,它需要用户创建一个附加有奖励的项目。 该表单分为不同的步骤,前两个是正常的项目,下一个是奖励,最后是一个简单的预览,让用户来回滑动即可创建完美的项目。 我的form
我有一个模型表单 - ClinicallyReportedSample,它链接到一个样本模型。 我正在尝试为 ClinicallyReportedSample 创建一个表单集,其中基于 Sample
背景:我正在构建一个个人词典网络应用程序,并且有一个术语和定义的查询集。在我的网络应用程序中,我有一个编辑页面,我想在其中显示一个 ModelFormSet,允许用户编辑任何/所有条目,并在需要时删除
我正在使用 Django 的 FormWizard。它工作正常,但我无法正确显示任何空模型表单集。 我有一个名为 Domain 的模型。我正在创建一个像这样的 ModelFormset: Domain
我是一名优秀的程序员,十分优秀!