我有一个名为“service”的字段。它存储了一个int列表,代表公司提供的服务(1=会计,2=HR等)。一旦列表保存到“service”字段,我希望能够将其作为“初始”值传递到表单,以便用户可以看到他们之前选择的选项。
什么工作:
1.用户可以选择服务
B)服务作为整数列表保存到“service”字段(例如[2,3,5])
不起作用:
a)在表单中不显示初始值,尽管'service'包含一个int列表。
model.py
class BaseServicesOffered(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
service = models.CharField(max_length=255, default='', null=True, blank=True)
def __str__(self):
return self.user.username
字符串
form.py
class BaseServicesOfferedForm(forms.ModelForm):
service = forms.MultipleChoiceField(required=False, widget=forms.CheckboxSelectMultiple)
def __init__(self, *args, **kwargs):
user = kwargs.pop('user')
selectedservices = kwargs.pop('selectedservices')
super(BaseServicesOfferedForm, self).__init__(*args, **kwargs)
self.fields['service'].choices = [(t.id, t.service) for t in AllServices.objects.filter(industrycode=user.userprofile.industry)]
self.fields['service'].initial = selectedservices
class Meta:
exclude = ('user',)
model = BaseServicesOffered
型
views.py
@login_required(login_url="/accounts/login/")
def baseservicesoffered(request):
try:
base_services_offered = BaseServicesOffered.objects.create(user=request.user)
except:
pass
user = request.user
services = user.baseservicesoffered.service
instance = get_object_or_404(BaseServicesOffered, user=user)
form = BaseServicesOfferedForm(request.POST or None, user=request.user, selectedservices=services, instance=instance)
if request.method == 'POST':
if form.is_valid():
instance = form.save(commit=False)
instance.user = request.user
service = form.cleaned_data['service']
services = [int(i) for i in service]
instance.service = services
instance.save()
return redirect('/accounts/profile/')
else:
context = {'form': form}
return render(request, 'accounts/setup8.html', context)
context = {'form': form}
return render(request, 'accounts/setup8.html', context)
型
多谢帮忙!
4条答案
按热度按时间f3temu5u1#
在你的表格
__init__
尝试改变字符串
到
型
并确保
selectedservices
是一个整数列表(而不是像choices
这样的成对列表,也不是一个带逗号的字符串)。PS:如果你把你的选择存储为字符串而不是整数
initial
应该是字符串列表。ar7v8xwq2#
你就快成功了。下面是你应该做的:
forms.py
字符串
9jyewag03#
我认为你的代码不工作的原因是:
在views.py:
字符串
给出一个 string 作为services的值,例如'[2,3,5]'。然后将services作为selectedservices传递到表单中:
型
在您的表单中,当您将selectedservices的值分配为service的初始值时:
型
一个字符串被赋给了initial,但是没有像“[2,3,5]”这样的项。您需要的是每个值2,3,5都传递给initial。
这里:
型
你正试图将一个列表保存到CharField中,它实际上被保存为“[2,3,5]”(你可以检查你的数据库表来确定)。
因此,您必须以某种方式将字符串selectedservices转换回形式的列表,或者不将列表保存到CharField中。
mwngjboj4#
我正在处理同样的问题。有一个带有CheckboxSelectMultiple小部件的MultipleChoiceField表单,并将数据保存为模型中的CharField。
数据被保存为看起来像列表的文字字符串,但不是。并且表单期望为所述字段的初始值提供列表。
将字符串转换为python列表的技巧如下所示:view.py
字符串
查看此博客了解更多:here