将视图中的列表传递给表单

时间:2017-06-21 15:29:36

标签: django python-3.x django-1.11

我在views.py中有一个视图,在我的forms.py中有一个表单。 我需要将我的视图列表[]传递给我的表格的MultipleChoiceField。

这是我的代码,我当然想念一些......

非常感谢

views.py

    def view_favorite(request):
        media = settings.MEDIA
        game_logo = settings.GAME_LOGO
        if request.user.is_authenticated():
            if request.method == 'POST' :
                return render(request, 'favorite.html', locals())
            else:
                favs = FavoriteGames.objects.filter(user_id=request.user.id).values_list('game_id', flat=True)
                list = []
                for fav in favs:
                    game = Games.objects.get(id=fav)
                    list.append((game.id, game.guid, game.title, game.logo, "checked"), )
                    nogame = Games.objects.filter(~Q(id__in=favs)).values_list('id', 'guid', 'title', 'logo')
                form = GamesEditorForm(list)

forms.py

class GamesEditorForm(forms.Form):
    def __init__(self, list, *args, **kwargs):
        super(GamesEditorForm, self).__init__(*args, **kwargs)

    favorite_games = forms.MultipleChoiceField(
        required=True,
        initial=True,
        widget=forms.CheckboxSelectMultiple(),
        choices=list,
        )

2 个答案:

答案 0 :(得分:0)

您可以直接将数据作为参数传递给函数

<强> views.py

from .forms import my_func

def some_func(request):
    my_list = [1,2,3]
    my_func(request, my_list)

<强> forms.py

def my_func(request, my_list):
    #Do something with my_list

答案 1 :(得分:0)

您可以做的是覆盖表单的默认init方法,并在创建表单时处理所有逻辑:

class YourOwnForm(forms.Form):
    a_field = forms.IntegerField(
        label="field",
        widget=forms.HiddenInput())

    def __init__(self, your_custom_list=None, *args, **kwargs):
        """
        Intantiation service.
        This method extends the default instantiation service.
        """
        super(CustomizationForm, self).__init__(*args, **kwargs)
      if your_custom_list:
            do stuff...
      else:
           error...
你会这样称呼它:

my_form = YourOwnForm(data, your_custom_list=[5,8,9])