MultipleChoiceField表单不显示用户的表单

时间:2018-04-10 07:43:23

标签: django django-views

我已经使用CheckboxSelectMultiple实现了一个MultipleChoiceField表单。它完美地工作,表单显示,用户选择的选项根据需要保存到BaseServicesOffered模型。问题是,当用户返回到表单时,未选中用户之前选择/提交的复选框 - 它们都是未选中的。我想象这是我的views.py的一个问题。这是我的代码:

models.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

forms.py

class BaseServicesOfferedForm(forms.ModelForm):
    service = forms.MultipleChoiceField(required=False, widget=forms.CheckboxSelectMultiple)

    def __init__(self, *args, **kwargs):
        user = kwargs.pop('user')  #this takes in the value of 'user', which is passed from the view function.
        super(BaseServicesOfferedForm, self).__init__(*args, **kwargs)
        self.fields['service'].choices = [(t.id, t.service) for t in AllServices.objects.filter(industrycode=user.userprofile.industry)]

    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
    instance = get_object_or_404(BaseServicesOffered, user=user)
    form = BaseServicesOfferedForm(request.POST or None, user=request.user, 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)

setup8.html

   <form id="post_form" method="post" action="" enctype="multipart/form-data">

        {{ form.non_field_errors }}

        {% csrf_token %}

        {{ form.as_p }}

        <div class="submitbutton">

            <button type="submit">
                SUBMIT
            </button>

        </div>

    </form>

更新:

这是在Charfield中存储整数列表的方法:

    service = form.cleaned_data['service']
    services = [int(i) for i in service]  #converts list of strings to list of ints
    instance.service = services

我已用此更新了上面的代码。

1 个答案:

答案 0 :(得分:0)

multiple_choice = forms.MultipleChoiceField(
    label=u"Select multiple", 
    choices=MY_CHOICES, 
    widget=forms.widgets.CheckboxSelectMultiple, 
    initial=(c[0] for c in MY_CHOICES)
)

您应为要为特定用户检查的选项设置inital参数。