В Django подключение пользователя к заполненной форме?

Прямо сейчас пользователи могут просматривать все формы, заполненные любым пользователем, даже если они вошли в систему, и все формы размещаются на одной html-странице. Я хочу, чтобы пользователи могли просматривать только свои собственные формы, которые они заполнили, когда вошли в свой аккаунт. Любые указания будут полезны. Я понимаю функции больше, чем классы в представлениях, идеальное решение будет использовать функции. Огромное спасибо за любой совет, так как это мой первый Django, я пробую самостоятельно, не следуя строго видео или урокам.

models.py

from django.db import models
from django.contrib.auth.models import User
from django.forms import ModelForm
from django import forms

class Step1_Model(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, null=True)
    title = "STEP 1: Safety during a violent incident"
    box1 = models.CharField(max_length=100, null=True)
    box2 = models.CharField(max_length=100, null=True)
    box3 = models.CharField(max_length=100, null=True)
    box4 = models.CharField(max_length=100, null=True)
    box5 = models.CharField(max_length=100, null=True)
    box6 = models.CharField(max_length=100, null=True)
    
    def __str__(self):
        return self.title
forms.py

from django import forms
from .models import Step1_Model

class Step1_Form(forms.ModelForm):
    box1 = forms.CharField()

    class Meta: 
        model = Step1_Model  #which model we want to use as a model for our model form
        fields= ("box1","box2","box3", "box4", "box5", "box6")
urls.py

from django.urls import path
from . import views 

urlpatterns = [

    path('login', views.loginPage, name='login_user'),
    path('logout', views.logoutUser, name='logout'),
    path('register_user', views.register_user, name='register_user'),


    path('', views.index, name='home'),

    path('step1', views.Step1_Form_Completion, name='step1'),
    path('form_view', views.Step1_Form_View, name='form_view'),

]
form.html

{% block content %}


</head>
<body>
        <form method='post'>
            {% csrf_token %}
        
        STEP 1: Safety during a violent incident. I will not always be able to avoid violent incidents. In order to increase safety I may use a variety of strategies.
        I can use some of the following strategies:
        <p>
        A. When I need to leave the house because of an emergency I will keep my keys in: {{ form.box1 }}. 
        <p>
        B. When I need to put out a fire I will:{{ form.box2 }}.
        </p>
        </p>
        <button type="submit">Submit</button>
        </form>
</body>
</html>

{% endblock content %}


form_view.html
<body>
<!-- user_input shows up here but way too much. not only the logged in users form.-->

{% if step1 %}
 <h1>Your Step 1 Plan</h1>

 <tr>
     {% for st in step1 %}
    <p>
    A.  I will <b>{{ st.box1 }}</b>. 
    <p>
    B. I will put the fire out by <b>{{ st.box2 }}</b> in order to leave quickly.
    </p>
index.html 
<!-- my homepage and how users get to view wand submit forms-->
{% extends 'base.html' %}

{% block content %}

<!--Row 1-->
  <div class="row">
    <div class="col-md-1">
      <p>{{request.user}}</p>
    </div>


<!--Row 2-->
  <div class="row">

    <div class="col-md-auto">
      Step 1: A Violent Incident
    </div>

    <div class="col-md-auto">
        <a href="{%  url 'step1'  %}">Form</a>
    </div>

    <div class="col-sm-auto">
        <a href="{% url 'form_view'  %}">View</a>
    </div>

  </div>
{% endblock %}

Вместо того, чтобы передавать все Step1_Model в представлении, просто передайте эту одну модель по назначению request.user

@login_required(login_url='login_user')  #sends user back to login page if they try to go to a view form.
def Step1_Form_View(request):
    """View for user to see completed form"""
    step1 = request.user.step1_model 
    return render(request,'form_view.html',{'step1': step1})

теперь вам не нужно {% for st in step1 %} в шаблоне form_view.html.

Для удобства чтения в будущем используйте PascalCase в именах классов (модели, формы и т.д.), вам не нужно добавлять 'model' к имени класса, и snake_case для имен функций.

Нашел ответ на этот вопрос, если кому-то интересно, я нигде не видел этого ответа в Интернете. Мне пришлось посмотреть больше видео о том, как работает доступ к базе данных. Мне нужно было добавить две строки кода: In views.py

  1. form.instance.user= request.user в моей функции form_completion.
  2. step1 = StepOne.objects.filter(user=request.user) в моей функции form_view.
  3. .

См. пример ниже:

@login_required(login_url='login_user') 
def Step1_Form_Completion(request):
    """Generates link for user to fill out form"""
    form = StepOneForm                #Assign the form to the variable in the function.
    if request.method == 'POST':     # if method or form is requested then POST or send data to this function. If someone is loggded in . . 
        form = StepOneForm(request.POST) #the method is form and it is to be posted.
        if form.is_valid():             #if the form is django's definiton for 'valid' then save it and redirect the user home.
            form.instance.user= request.user
            form.save()
            return redirect('/')
    return render(request, 'form.html', {'form':form} ) # return  this function to the form.html page and let it use form as s variable and call it's attributes (form.box1)
@login_required(login_url='login_user')  #sends user back to login page if they try to go to a view form.
def Step1_Form_View(request):
    """View for user to see completed form"""
    step1 = StepOne.objects.filter(user=request.user)
    return render(request,'form_view.html',{'step1': step1})
Вернуться на верх