因此,我拥有用户选择个人资料的第一种形式:
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请求中实际呈现的表单的测试默认值。
答案 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})