如何比较Django中的表单,模型和auth_User

时间:2018-02-06 17:32:53

标签: django forms

我有想法创建类似管理面板的东西。在该面板中,用户(或管理员)例如在我的情况下将添加名为" website"的字段。在这一刻我有一个问题。我在myapp模型中创建了网站:

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

class Website(models.Model):
    user = models.ForeignKey(User,related_name="website_user", on_delete=models.CASCADE)
    website = models.CharField(help_text="Podaj stronę wraz z http lub https",max_length=250,verbose_name='Strona www', unique=True)

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

    def __str__(self):
        return self.website

之后,我创建了一个表单,以便在登录时为用户显示:

from django import forms
from django.contrib.auth.models import User
from .models import Website

class WebsiteForm(forms.ModelForm):
    class Meta:
        model = Website
        fields = ('website',)

下一步是创建视图:

from django.shortcuts import render
from django.contrib.auth import authenticate, login
from django.contrib.auth.models import User
from .forms import LoginForm, UserRegistrationForm, WebsiteForm
from django.http import HttpResponse
from django.contrib.auth.decorators import login_required
from django.contrib import messages
from .models import Website
...
@login_required
def add_website(request):
    if request.method == 'POST':
        website_form = WebsiteForm(data=request.POST)
        if website_form.is_valid():
            new_website = website_form.save(commit=False)
            new_website.post = add_website
            new_website.save()
    else:
        website_form = WebsiteForm()
    return render(request, 'konto/add_website.html', {'add_website': add_website, 'website_form': website_form})

最后,我创建了一个负责显示表单和操作的html文件

        {% if request.user.is_authenticated %}
        {% if new_website %}
        <h2>Twója strona oczekuje na zaakceptowanie</h2>
        {% else %}
        <h4>Dodaj stronę do monitorowania</h4>
        <form action="." method="POST">
        {{website_form.as_p}}
        {% csrf_token %}
        <p><input type="submit" value="Dodaj stronę"></p>
        </form>
        {% endif %}
        <a href="{% url 'dashboard' %}">Powrót</a>
        {% endif %}

我的问题是,当我以管理员身份登录时,我尝试使用此表单添加新记录。但没有任何事情发生。我填写表格,点击按钮后脚本将我重定向到仪表板。在仪表板中,我有一个添加网站的空白列表。 dashboard.html中的部分代码

...
{% if request.user.is_authenticated %}
Twoja www:
{% for website in websites %}
{{website.website}}
{% endfor %}
{% endif %}
...

以及显示网站列表的视图:

@login_required
def website(request):
    websites = Website.objects.all().order_by('-User')
    context = {'websites:', websites}
    return render(request, 'konto/dashboard.html', context=context)

我想制作一个页面列表,以便添加页面的用户只能看到他的记录而不是数据库中存在的所有记录。 编辑: 有时当我更改表单链接时出现错误

IntegrityError at /konto/add-website/
NOT NULL constraint failed: konto_website.user_id

编辑:

现在我有这样的事情:

@login_required
def new_website(request):
    if request.method == "POST":
        new_website = WebsiteForm(request.POST)
        if new_website.is_valid():
            new_website=new_website.save(commit=False)
            new_website.user = request.user
            new_website.save()
            messages.success(request, 'Pomyślnie dodano stronę')
            return render(request, 'konto/add_website_ok.html')
    else:
        new_website = WebsiteForm()
    return render(request, 'konto/add_website.html', {'new_website':new_website})

一切正常,如果我以管理员身份登录,我可以添加新网站作为管理员。如果我以用户身份登录,我可以添加新网站作为用户。在Django Admin中,我可以看到用户添加的每个记录。但我在自己的控制面板中也创建了类似仪表板的东西。在该控制面板中,我想显示用户添加的网站列表。例如,如果我以“用户”身份登录我只能看到我的网页,而不是列表中的所有网页。 我想在dashboard.html中将其显示为:

{% if request.user.is_authenticated %}
<b>Monitoring www:</b>
{% for website in website_list %}
{{website.website}}
{% endfor %}
{% endif %}

但现在我只看到一个标签&#39;监控www&#39;,没有其他.. 我想你了解我。 :)

第二次编辑

视图 @login_required

def website(request):
    website_list = Website.objects.filter(user=request.user).order_by('-User')
    context = {'website_list:', website_list}
    return render(request, 'konto/dashboard.html', context=context)

HTML

{% for website in website_list %}
{{website.website}}
{% endfor %}
{% endif %}

1 个答案:

答案 0 :(得分:1)

我不确定你在这里做什么

    if website_form.is_valid():
        new_website = website_form.save(commit=False)
        new_website.post = add_website
        new_website.save()

但我认为它应该有效,如果它被简化为:

    if website_form.is_valid():
        new_website = website_form.save()


@login_required
def add_website(request):
    variables = {}
    if request.method == 'POST':
        website_form = WebsiteForm(data=request.POST)
        if website_form.is_valid():
            new_website = website_form.save(commit=False)
            new_website.post = add_website
            new_website.save()
    else:
        website_form = WebsiteForm()

    variables['add_website'] = add_website
    variables['website_form'] = website_form
    if new_website: variables['new_website'] = True

    return render(request, 'konto/add_website.html', variables)