gpt4 book ai didi

处理现有记录时的 django 表单和 ModelMultipleChoiceField

转载 作者:行者123 更新时间:2023-12-04 23:08:43 25 4
gpt4 key购买 nike

我正在尝试做一些我认为很常见的事情,但我真的不确定如何解决这个问题。

我目前在做什么:目前,我在表单上生成了一个复选框列表(使用“CheckboxSelectMultiple”),它会自动勾选 django 中所有用户列表中“成员”中的所有用户(由“queryset=User.objects.all()”生成) ”)。

我真正想做的事:我不想列出 Django 中的每个用户,我只想在“成员”中显示用户列表。

我认为如何做到:我想我可以通过将查询集修改为“project.members.all()”之类的东西来做到这一点,其中 project = Project(项目的特定实例)。但是如何将此上下文传递给我的表单?

# models.py
class Project(models.Model):
name = models.CharField(max_length=100)
members = models.ManyToManyField(User, related_name="members", blank=True, null=True)


# forms.py
class ProjectSettings(forms.Form):
summary = forms.CharField(max_length=200)
members = forms.ModelMultipleChoiceField(queryset=User.objects.all(), widget=forms.CheckboxSelectMultiple())


#template snippet
<form method="post" action="/projects/{{ project.slug }}/settings/save/">
{% for field in form %}
<div class="form-row">
{{ field.errors }}
{{ field.label_tag }} {{ field }}
{% if field.help_text %}
<p class="help-text">{{ field.help_text }}</p>
{% endif %}
</div>
{% endfor %}


# view.py
def update_project(request, project_slug):
if request.method == 'POST':
form = ProjectSettings(request.POST)
if form.is_valid(): # All validation rules pass
# Process the data in form.cleaned_data
project.summary = form.cleaned_data['summary']
project.members = form.cleaned_data['members']
project.save()
return HttpResponseRedirect('/projects/' + project.slug + '/')
else:
data_dict = {'summary': project.summary, 'members': project.members.all()}
form = ProjectSettings(initial=data_dict)

return render_to_response('update_project.html', {'form': form}, context_instance=RequestContext(request))

我希望这是有道理的,我深表歉意,因为我真的认为这是我在这里遗漏的一些简单的东西 - 但我一直无法找到一个具体的例子来展示如何使用非模型表单来做到这一点。

提前致谢,

杰米

最佳答案

我猜你在项目模型中遗漏了一些东西。您的观点也在呼唤project.members.all()project.summary没有在 else 语句中获得一个项目。

假设您在项目模型中有一个汇总字段,如果您想使用表单而不是模型表单,则:

表格.py

class ProjectSettings(forms.Form):
summary = forms.CharField(max_length=200)

def __init__(self, qs=None, *args, **kwargs):
super(ProjectSettings, self).__init__(*args, **kwargs)
if qs:
self.fields['members'] = forms.ModelMultipleChoiceField(queryset=qs, widget=forms.CheckboxSelectMultiple())

在您的 views.py 中,您会将 qs 传递给表单:
def update_project(request, project_slug):
project = None
if project_slug:
project = get_object_or_404(Project, name=project_slug) # somehow get your project object

qs = project.members.all()

if request.method == 'POST':
form = ProjectSettings(qs, request.POST)
if form.is_valid(): # All validation rules pass
# Process the data in form.cleaned_data
project.summary = form.cleaned_data['summary']
project.members = form.cleaned_data['members']
project.save()
return HttpResponseRedirect('/projects/' + project.slug + '/')
else:
form = ProjectSettings(qs)

return render_to_response('update_project.html', {'form': form}, context_instance=RequestContext(request))

如果您的项目模型中确实有汇总字段,那么在这里使用 ModelForm 是有意义的。

表格.py:
class ProjectSettings(forms.ModelForm):
def __init__(self, qs=None, *args, **kwargs):
super(ProjectSettings, self).__init__(*args, **kwargs)
self.fields['members'].widget = forms.CheckboxSelectMultiple()
class Meta:
model = Project
fields = ('summary', 'members')

View .py:
def update_project(request, project_slug):
project = None
if project_slug:
project = get_object_or_404(Project, name=project_slug) # somehow get your project object

if request.method == 'POST':
form = ProjectSettings(request.POST, instance=project)
if form.is_valid(): # All validation rules pass
# Process the data in form.cleaned_data
project.save()
return HttpResponseRedirect('/projects/' + project.slug + '/')
else:
form = ProjectSettings(instance=project)

return render_to_response('update_project.html', {'form': form}, context_instance=RequestContext(request))

关于处理现有记录时的 django 表单和 ModelMultipleChoiceField,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5367818/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com