How to handle data from two forms in one view?

ε祈祈猫儿з 提交于 2021-02-10 15:46:26

问题


So I have two forms.ModelForm for my two models

First:

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',)

Second:

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',)

I've tried writing a view for them but it doesn't work, seems like it just won't save because whenever I hit submit button it just refreshes the page and cleans the fields without redirecting me to needed URL. The model instances in my DB aren't updated either.

Here's the view:

def link_profile(request):
context = {
'form': ProfileChoice(user_id=request.user.id),
'form2': TranslatorChoice(user_id=request.user.id)
}
if request.method == 'POST':
    form = ProfileChoice(request.POST)
    form2 = TranslatorChoice(request.POST)
    if form.is_valid():

        login = form.cleaned_data.get('login')
        translator = form.cleaned_data.get('owner')
        link = Profile.objects.get(login=login)
        link.owner = login
        link.save(['owner'])
        form.save()
        form2.save()
        return redirect('dashboard')
return render(request, 'registration/link.html', context)

I know also something is wrong is because I am using to many save functions. I just don't have any experience in creating views like that...

Sharing my template:

{% extends 'base.html' %}

{% block content %}
  <h2>Add profile</h2>
  <form method="post">
    {% csrf_token %}
    <table>

    {{ form.as_table }} {{ form2.as_table }}
    </table>

    <button type="submit">Link</button>
  </form>
{% endblock %}`

And my urls.py part with the view:

url(r'^link/', views.link_profile),

回答1:


You didn't share your urls.py or the form in your template so it's not clear if the view is being executed, or how you're passing your forms. But, here's something that might work if you're not doing it already.

{{ form.as_table }} {{ form2.as_table }}

FYI: there are some indentation issues with your code but I'm assuming that that's just something that happened when you pasted it here.



来源:https://stackoverflow.com/questions/64453476/how-to-handle-data-from-two-forms-in-one-view

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!