В 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
- form.instance.user= request.user в моей функции form_completion.
- step1 = StepOne.objects.filter(user=request.user) в моей функции form_view. .
См. пример ниже:
@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})