我有两个模型与M2M的关系,我想建立一个表格,允许管理链接,但也可以添加对选定值的控制。 这发生在管理模板之外
我管理了定义表单来管理链接,但是我不能考虑附加信息来定义有效性控件。
以下是我的模型:
class EventGroup(models.Model):
company = models.ForeignKey(
Company, on_delete=models.CASCADE, verbose_name="société"
)
users = models.ManyToManyField(UserComp, verbose_name="utilisateurs", blank=True)
group_name = models.CharField("nom", max_length=100)
weight = models.IntegerField("poids", default=0)
class Event(models.Model):
company = models.ForeignKey(
Company, on_delete=models.CASCADE, verbose_name="société"
)
groups = models.ManyToManyField(EventGroup, verbose_name="groupes", blank=True)
rules = [("MAJ", "Majorité"), ("PROP", "Proportionnelle")]
event_name = models.CharField("nom", max_length=200)
event_date = models.DateField("date de l'événement")
slug = models.SlugField()
current = models.BooleanField("en cours", default=False)
quorum = models.IntegerField(default=33)
rule = models.CharField(
"mode de scrutin", max_length=5, choices=rules, default="MAJ"
)
表格:
class EventDetail(forms.ModelForm):
groups = forms.ModelMultipleChoiceField(
label = "Liste des groupes",
queryset = EventGroup.objects.none(),
widget = forms.CheckboxSelectMultiple,
required = False
)
class Meta:
model = Event
fields = ['event_name', 'event_date', 'quorum', 'rule', 'groups']
观点:
def event_detail(request, evt_id=0):
if evt_id > 0:
current_event = Event.objects.get(id=evt_id)
event_form = EventDetail(request.POST or None, instance=current_event)
else:
event_form = EventDetail(request.POST or None)
company = Company.get_company(request.session['comp_slug'])
event_form.fields['groups'].queryset = EventGroup.objects.\
filter(company=company).\
order_by('group_name')
if request.method == 'POST':
if event_form.is_valid():
event_form.save()
return render(request, "polls/event_detail.html", locals())
这对添加或删除专用于所选或新事件的组没有问题,但我需要添加组的权重信息,并控制所选组的总权重恰好为100。除此之外,我还需要确保所选组中的每个用户只列出一次。 是否有人知道如何实现这些控制,或者至少如何显示附加信息以向用户提供相关的必要信息
非常感谢你的建议
在选项中显示组权重的最简单方法是更改EventGroup的
__str__
方法。它看起来像这样:因此,一个称为“组”且权重为75的组将在选项列表中显示为“组(75)”
如果您想动态显示所选选项的总权重,则需要一些javascript。您将需要一个在单击任何选项时触发的函数,并以某种方式找到该选项的权重。在
__str__
解决方案之后,它可能如下所示:这必须位于polls/event_detail.html模板导入的.js文件中
这个脚本所做的是监听对django CheckboxMultiple小部件的任何LI元素的点击,并通过一些简单的字符串操作获得其权重。字符串类似于“组的名称(23)”。如果选中该选项,脚本将从当前_权重中减去其权重(用户已取消选择该选项)。否则,它将增加重量。更新后的总和将以数字形式显示在一个元素上,您将使用id='current\u weight'添加到event_detail.html模板中。然后,通过启用或禁用表单的提交按钮,该变量可以控制表单是否可以提交
如果希望服务器端验证此权重==100限制,可以在views.py中执行类似操作:
这样,仅当权重==100时,才会保存实例。否则,您可以向用户传递适当的错误消息
我无法正确地测试这个脚本,但我希望这个想法能有所帮助。我不知道你说的“确保所选组中的每个用户只列出一次”是什么意思,所以我无法回答。好机会
相关问题 更多 >
编程相关推荐