【问题标题】:MultipleChoiceField form not displaying user's instance of formMultipleChoiceField 表单不显示用户的表单实例
【发布时间】:2018-04-10 07:43:22
【问题描述】:

我已经使用 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

我已经用这个更新了我上面的代码。

【问题讨论】:

  • models.CharField 并非旨在存储多项选择。如果您查看存储在数据库中的值,它将类似于"['choice1', 'choice2']"(这是一个字符串,而不是一个列表)。您可能会发现像 django-multiselectfield 这样的库很有用。
  • 谢谢。 django 中是否没有默认存储列表的模型字段?
  • 如果有我会提到它;)
  • 哈哈。很公平:)
  • 我已经弄清楚如何在 CharField 中存储列表。请参阅初始帖子的更新。

标签: django django-views


【解决方案1】:
multiple_choice = forms.MultipleChoiceField(
    label=u"Select multiple", 
    choices=MY_CHOICES, 
    widget=forms.widgets.CheckboxSelectMultiple, 
    initial=(c[0] for c in MY_CHOICES)
)

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

【讨论】:

  • 我真的不想设置默认值。我只希望用户在之前的表单提交中检查的选项在他们再次加载表单时出现。
  • 我现在明白这将如何潜在地帮助我。谢谢!
猜你喜欢
  • 2013-07-07
  • 2019-08-25
  • 1970-01-01
  • 2019-02-03
  • 2013-01-22
  • 2010-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多