django 将列表作为初始值传入MultipleChoiceField表单

7ajki6be  于 12个月前  发布在  Go
关注(0)|答案(4)|浏览(152)

我有一个名为“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)


多谢帮忙!

f3temu5u

f3temu5u1#

在你的表格__init__尝试改变

self.fields['service'].initial = selectedservices

字符串

self.initial['service'] = selectedservices


并确保selectedservices是一个整数列表(而不是像choices这样的成对列表,也不是一个带逗号的字符串)。
PS:如果你把你的选择存储为字符串而不是整数initial应该是字符串列表。

ar7v8xwq

ar7v8xwq2#

你就快成功了。下面是你应该做的:
forms.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

字符串

9jyewag0

9jyewag03#

我认为你的代码不工作的原因是:
在views.py:

services = user.baseservicesoffered.service

字符串
给出一个 string 作为services的值,例如'[2,3,5]'。然后将services作为selectedservices传递到表单中:

form = BaseServicesOfferedForm(request.POST or None, user=request.user, selectedservices=services, instance=instance)


在您的表单中,当您将selectedservices的值分配为service的初始值时:

self.fields['service'].initial = selectedservices


一个字符串被赋给了initial,但是没有像“[2,3,5]”这样的项。您需要的是每个值2,3,5都传递给initial。
这里:

services = [int(i) for i in service] 
instance.service = services


你正试图将一个列表保存到CharField中,它实际上被保存为“[2,3,5]”(你可以检查你的数据库表来确定)。
因此,您必须以某种方式将字符串selectedservices转换回形式的列表,或者不将列表保存到CharField中。

mwngjboj

mwngjboj4#

我正在处理同样的问题。有一个带有CheckboxSelectMultiple小部件的MultipleChoiceField表单,并将数据保存为模型中的CharField。
数据被保存为看起来像列表的文字字符串,但不是。并且表单期望为所述字段的初始值提供列表。
将字符串转换为python列表的技巧如下所示:view.py

import ast

def land_demand_form(request):
    obj= get_object_or_404(Contact, user=request.user)
    res = ast.literal_eval(obj.prefered_contact)
    form = ContactForm(request.POST or None, initial={"prefered_contact": res})
    context= {'form': form}

字符串
查看此博客了解更多:here

相关问题