将变量传递给表单操作

时间:2020-10-25 12:55:38

标签: python django django-views django-forms django-templates

因此,我拥有用户选择个人资料的第一种形式:

class ProfileChoice(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        self.user_id = kwargs.pop('user_id',None)
        super(ProfileChoice, self).__init__(*args, **kwargs)
        self.fields['login'].queryset = Profile.objects.all().filter(created_by_id = self.user_id)

    login = forms.ModelChoiceField(queryset= None, label='Profile')
    class Meta:
        model = Profile
        fields = ('login',)

提交后,我需要将他重定向到下一个表单:

class TranslatorChoice(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        self.user_id = kwargs.pop('user_id',None)
        super(TranslatorChoice, self).__init__(*args, **kwargs)

        self.fields['owner'].queryset = Translator.objects.all().filter(owner_id = self.user_id)
    owner = forms.ModelChoiceField(queryset =  None)
    class Meta:
        model = Translator
        fields = ('owner',)

此视图:

class ProfileOwner(UpdateView):
    model = Profile
    template_name = 'registration/update.html'
    success_url="/account/"
    form_class = TranslatorChoice
    @method_decorator(user_passes_test(client_check, login_url='/account/'))
    def dispatch(self, *args, **kwargs):
        return super().dispatch(*args, **kwargs)
    def get_form_kwargs(self):
        kwargs = super(ProfileOwner, self).get_form_kwargs()
        kwargs['user_id'] = self.request.user.id
        return kwargs
    def get_object(self, queryset=None):
        profile = super(ProfileOwner, self).get_object(queryset)
        if profile.created_by != self.request.user:
            raise Http404("Profile doesn't exist")
        return profile

需要对以第一种形式选择的配置文件执行更新。我正在尝试通过将pk传递到URL来实现。这是urls.py

url(r'^update/(?P<pk>\d+)', ProfileOwner.as_view(), name='profile_owner_update')

我的模板在这里:

{% extends 'base.html' %}

{% block content %}
  <h2>Add profile</h2>
  <form method="post" action="{% url 'profile_owner_update' pk=id %}">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">Choose</button>
  </form>
{% endblock %}

,应该将id变量传递给form操作的视图在这里:

def link_translator(request):
    id = 1
    if request.method == 'POST':
        form = ProfileChoice(request.POST)
        if  form.is_valid():
            login = form.cleaned_data['login']
            id = Profile.objects.get(login=login)
            id = id.id
            return render(request, 'registration/linkt.html', {'form': form,
            'id': id})
    else:
        form = ProfileChoice(user_id=request.user.id)
    return render(request, 'registration/linkt.html', {'form': form,
    'id': id})

这显然不起作用,开头的id = 1就像是要在GET请求中实际呈现的表单的测试默认值。

1 个答案:

答案 0 :(得分:0)

link_translator视图中,而不是POST上的render,您需要使用第二种形式重定向到该视图:

def link_translator(request):
    if request.method == 'POST':
        form = ProfileChoice(request.POST)
        if  form.is_valid():
            login = form.cleaned_data['login']
            profile = Profile.objects.get(login=login)
            second_url = django.urls.reverse('profile_owner_update', args=[profile.id])
            return django.shortcuts.redirect(second_url)
    else:
        form = ProfileChoice(user_id=request.user.id)
    return render(request, 'registration/linkt.html', {'form': form})