如何显示记录仅适用于所有用户的用户

时间:2018-02-07 11:12:04

标签: python django

我有点问题。我想在列表中只显示属于添加它的用户的记录。在我的应用中,当我登录时,用户'我想从列表中添加新记录,包括来自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})

forms.py 我有:

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

models.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)

urls.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 %}

编辑:

models.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

2 个答案:

答案 0 :(得分:3)

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})

作为旁注:成功发布POST you want to redirect后(即使是相同的网址)。当用户重新加载页面时,这可以避免很多麻烦(以及重复提交)

答案 1 :(得分:0)

只需将用户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})

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

forms.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.