Libby Murray
Libby Murray

Reputation: 29

Handling 2 Django forms - passing data from one to the other

I have 2 Django forms: one, where the user uploads an article, and the second, where the user can edit a list of article words into one of three buckets (change the column value: bucket 1-3).

forms.py

class UploadForm(forms.ModelForm):
    class Meta:
        model  = Upload
        fields = ('name','last_name','docfile',) 
        
      

class Doc_wordsForm(forms.ModelForm):
    class Meta:
        model= Doc_words
        fields= ('id','word','word_type','upload',) #upload is foreign key value

After the user uploads the article, I have a function in views.py that breaks down the uploaded article into a list of words.

I want these words to be looped through and added to a database table(where each row is a word), then have the second form reference these words.

Views.py

    # upload_id = (request.GET.get("id"))
    if request.method == 'POST':
        form = UploadForm(request.POST, request.FILES) 
        if form.is_valid():
            form.save()
           
            data = request.FILES['docfile']#.read().decode('UTF-8')
            words=get_keywords(data)
            results=list(find_skills(words))
            
            for word in results: 
                form2 = Resume_words(word = word, word_type='exclude', upload = upload_id)
                 form2.save()


            
            return render(request, 'word_list.html',{
                "results":results
            })
    else:
        form = UploadForm()
      
    return render(request, 'upload.html', {
        'form':form
    })

I having trouble pulling these pieces together and I'm desperate for help of any kind! I having trouble with the following steps:

  1. I don't know how to capture the current users instance when saving to the table. I get an error in the above Views.py code.
  2. I don't know how to have the second form reference the current user from the first form.

Please let me know if I can provide more information or clarity on anything above. Also, feel free to answer one question, or simply point me to where there is an example similar to this, any light shed is greatly appreciated.

Upvotes: 2

Views: 50

Answers (1)

Leyla Krz
Leyla Krz

Reputation: 116

There are many ways to get user's info in view. the most basic way (not recommended, AT ALL!) is to pass user's id to every view from every view. for example in login view you pass user's id in context:

return render(request, 'main_page.html',{
          "user_id":user.id
          })

and make every view get this id whether in url or query parameter.

  • using url:

urls.py

path('any/pk/', AnyView.as_view(), name='carrot'),

view.py

class AnyView(Views):
    def get(request, pk):
        user=User.objects.get(pk=pk)
    def post(request, pk):
        user=User.objects.get(pk=pk)

your_template.html

<!-- post request -->
<form action="{% url 'carrot' user_id %}" method="post">...</form> 
<!-- get request -->
<a href={% url 'carrot' user_id %}></a>
  • using query parameters:

urls.py

path('any/', AnyView.as_view(), name='carrot'),

view.py

class AnyView(Views):
    def get(request):
        user=request.GET.get('pk', False)
        if user:
            user=User.objects.get(pk=pk)
    def post(request):
        user=request.POST.get('pk', False)
        if user:
            user=User.objects.get(pk=pk)

your_template.html

<!-- post request -->
<form action="{% url 'carrot' %}?pk={{ user_id }}" method="post">...</form> 
<!-- get request -->
<a href="{% url 'carrot' %}?pk={{ user_id }}"></a>

a much much better way is using django default authentication for log in, log out, permission handling and finally getting user information from request without all this unnecessary code.

view.py

class AnyView(Views):
    def get(request):
        user=request.user
    def post(request):
        user=request.user

to implement django authentication check this link:

https://developer.mozilla.org/en-US/docs/Learn/Server-side/Django/Authentication

Upvotes: 1

Related Questions