Django: Как показать только данные, соответствующие текущему пользователю? - PullRequest
0 голосов
/ 20 февраля 2020

Я пытаюсь создать простую веб-страницу в Django, где пользователи смогут создавать базы данных через ModelForms и исследовать только свой собственный созданный контент. Они не смогут видеть данные, созданные другими пользователями. До сих пор я не мог понять, что каждый пользователь по-прежнему может видеть данные всех других пользователей.

В своем файле models.py я связал свою базу данных с пользователем по внешнему ключу. Я думаю, что проблема заключается в моем view.py, но я как-то застрял ..

Буду благодарен за любую помощь. Заранее спасибо!

Это мой models.py :

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

CHOICES = (
    ('rent', 'Rent'), 
    ('grocery', 'Grocery'), 
    ('shopping', 'Shopping'), 
    ('gym', 'Gym'), 
    ('phone', 'Phone'), 
    ('freetime', 'Freetime'), 
    ('other', 'Other')
)

class UserDetails(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="new_spending", null=True)   
    title = models.CharField(max_length=100)
    notes = models.CharField(max_length=255)
    expense_name = models.CharField(max_length=255)
    cost = models.FloatField()
    date_added = models.DateTimeField()
    category = models.CharField(max_length=25, choices=CHOICES)


    def __str__(self):
        return self.title

Мой forms.py :

from django import forms
from datetime import date
from django.forms import ModelForm
from .models import UserDetails


class UserModelForm(ModelForm):
    current_date = date.today()
    YEARS = [x for x in range(current_date.year - 1, current_date.year + 6)]
    today = current_date.strftime("%Y-%m-%d")

    date_added = forms.DateField(initial=today, widget=forms.SelectDateWidget(years=YEARS))

    class Meta:
        model = UserDetails
        fields = ['title', 'notes', 'expense_name', 'cost', 'date_added', 'category']

Мой views.py :

from django.shortcuts import render
from django.http import HttpResponse
from django.db import models
from .models import UserDetails
from .forms import UserModelForm

def userDetails(request):         

    if request.method == 'POST':   
        form = UserModelForm(request.POST)    
        if form.is_valid():
            u = form.save()

            users = UserDetails.objects.all()
            request.user.new_spending.add(u) 

            return render(request, 'budget_app/display.html', {        
                'users': users
                })

    else:
        form_class = UserModelForm

        return render(request, 'budget_app/userdetails.html', {
            'form': form_class,
            })

My html file :


{% extends 'budget_app/budget_base.html' %}

{% block content %}
<head>
<style>
table {
  width:100%;
}
table, th, td {
  border: 1px solid black;
  border-collapse: collapse;
}
th, td {
  padding: 15px;
  text-align: left;
}
table#t01 tr:nth-child(even) {
  background-color: #eee;
}
table#t01 tr:nth-child(odd) {
 background-color: #fff;
}
table#t01 th {
  background-color: black;
  color: white;
}
</style>
</head>

<body>

</br>
<h2>Your Spending History</h2>
</br>

<table id="t01">

  <tr>
    <th>Title</th>
    <th>gender</th>
    <th>Notes</th>
    <th>Expense name</th>
    <th>Cost</th>
    <th>Date</th>
    <th>Category</th>
  </tr>

  {% for item in users %}

  <tr>

    <td>{{ item.title }}</td>
    <td>{{ item.gender|default:"NA" }}</td>
    <td>{{ item.notes }}</td>
    <td>{{ item.expense_name }}</td>
    <td>{{ item.cost }}</td>
    <td>{{ item.date_added }}</td>
    <td>{{ item.category }}</td>
  </tr>
{% endfor %}
</table>
<br>

</body>

{% endblock %}  

Ответы [ 2 ]

0 голосов
/ 21 февраля 2020

попробуйте выбрать только текущие данные пользователя с помощью набора запросов, например:

users = request.user.new_spending.all ()

0 голосов
/ 20 февраля 2020

Чтобы ограничить детали, которые может видеть пользователь, вы должны передать объекты, которые отфильтрованы, чтобы иметь отношение только к этому пользователю.

"UserDetails.objects.all ()" должно выглядеть так: UserDetails .objects.filter (user = request.user)

...