如何显示只属于用户的记录,而不是所有用户的记录

2024-05-23 23:07:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我有个小问题。我想在列表中只显示属于添加它的用户的记录。在我的应用程序中,当我以“用户”身份登录并想添加新记录(包括列表中的记录)时,我会从ForeignKey看到db中的所有记录。如何正确制作? enter image description here

在“Strona www”中,当我展开列表时,我会看到所有记录,而不仅仅是用户个人添加的记录。 我的观点是:

@login_required
def new_keyword(request):
    if request.method == "POST":
        new_keyword = KeywordForm(request.POST)
        if new_keyword.is_valid():
            new_keyword=new_keyword.save(commit=False)
            new_keyword.user = request.user
            new_keyword.save()
            messages.success(request, 'Pomyślnie dodano słowo kluczowe')
            return render(request, 'konto/new_keyword_ok.html')
    else:
        new_keyword = WebsiteForm()
    return render(request, 'konto/new_keyword.html', {'new_keyword':new_keyword})

表单中.py我有:

class KeywordForm(forms.ModelForm):
    class Meta:
        model = Keyword
        fields = ('www', 'keyword')

型号.py

class Keyword(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name="Użytkownik")
    www = models.ForeignKey(Website, on_delete=models.CASCADE, verbose_name="Strona www")
    keyword = models.CharField(max_length=250, verbose_name="Słowo kluczowe", unique=False)

url.py

path('new-keyword/', new_keyword, name='new_keyword'),

html用于显示的表单是:

{% if request.user.is_authenticated %}
<form action="." method="post">
    {{ new_keyword.as_p }}
    {% csrf_token %}
    <p><input type="submit" value="Dodaj nowe słowo kluczowe" ></p>
    <a href="{% url 'dashboard' %}">Powrót do monitoringu</a>
</form>
{% endif %}

编辑:

型号.py

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

class Website(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name="Użytkownik")
    website = models.CharField(max_length=250,verbose_name='Strona www', unique=False)

    class Meta:
        verbose_name = 'Strona www'
        verbose_name_plural = 'Strony www'

    def __str__(self):
        return self.website

class Keyword(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name="Użytkownik")
    www = models.ForeignKey(Website, on_delete=models.CASCADE, verbose_name="Strona www")
    keyword = models.CharField(max_length=250, verbose_name="Słowo kluczowe", unique=False)

    class Meta:
        verbose_name = 'Słowo kluczowe'
        verbose_name_plural = 'Słowa kluczowe'

    def __str__(self):
        return self.keyword

Tags: namenewverboseonmodelsrequestwww记录
2条回答

request.user传递给表单并使用反向关系user.website_set

表格:

class KeywordForm(forms.ModelForm):
    class Meta:
        model = Keyword
        fields = ('www', 'keyword')

    def __init__(self, user, *args, **kwargs):            
        super(KeywordForm, self).__init__(*args, **kwargs)
        self.fields['www'].queryset = user.website_set.all() 
        self.user = user

    def save(self, commit=True):
        instance = super(KeywordForm, self).save(commit=False)
        instance.user = self.user
        if commit:
            instance.save()
        return instance

视图:

@login_required
def new_keyword(request):
    if request.method == "POST":
        new_keyword = KeywordForm(request.user, request.POST)
        if new_keyword.is_valid():
            new_keyword.save()
            messages.success(request, 'Pomyślnie dodano słowo kluczowe')
            # DONT DO THIS ! REDIRECT INSTEAD
            return render(request, 'konto/new_keyword_ok.html')
    else:
        new_keyword = KeywordForm(request.user)
    return render(request, 'konto/new_keyword.html', {'new_keyword':new_keyword})

作为旁注:在成功发布you want to redirect(即使发送到相同的url)之后。这样就避免了用户重新加载页面时的许多麻烦(以及重复提交)

只需将用户id传递给表单,然后为字段设置查询集

像这样:

如何将用户传递到表单:

在你看来:

@login_required
def new_keyword(request):
    if request.method == "POST":

        #### Notice this part.
        new_keyword = KeywordForm(data=request.POST, u=request.user)
        if new_keyword.is_valid():
            new_keyword=new_keyword.save(commit=False)
            new_keyword.user = request.user
            new_keyword.save()
            messages.success(request, 'Pomyślnie dodano słowo kluczowe')
            return render(request, 'konto/new_keyword_ok.html')
    else:

        # Notice this part.
        new_keyword = WebsiteForm(data=None, u=request.user)
    return render(request, 'konto/new_keyword.html', {'new_keyword':new_keyword})

如何在表单中检索用户并设置查询集:

表单.py:

class KeywordForm(forms.ModelForm):
    class Meta:
        model = Keyword
        fields = ('www', 'keyword')

    def __init__(self, current_user, *args, **kwargs):
        self.u = kwargs.pop("u") ## The user you just passed.
        super(KeywordForm, self).__init__(*args, **kwargs)
        self.fields['www'].queryset = Website.objects.filter(user=self.u) ## Setting the queryset.

相关问题 更多 >