Django没有规范用户可以选择的内容

时间:2018-03-20 21:10:58

标签: python django django-forms django-templates

我是Django的新手,所以不要评判我:)。我正在制作一个博客项目,一切都很顺利,除了一件事。创建帖子时,用户可以选择之前登录过的任何其他作者。有没有办法将作者名称空间设置为当前登录的用户?这是我的代码:

#!/usr/bin/env python
import pika

connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost'))
channel = connection.channel()

channel.queue_declare(queue='hello')

def callback(ch, method, properties, body):
    print(" [x] Received %r" % body)

channel.basic_consume(callback,
                      queue='hello',
                      no_ack=True)

print(' [*] Waiting for messages. To exit press CTRL+C')
channel.start_consuming()

我的forms.py

Models.py

    from django.db import models
    from django.utils import timezone
    from django.core.urlresolvers import reverse
    from django.core.exceptions import ValidationError
    from django.utils.translation import gettext_lazy as _
    from django.contrib.auth.models import User


    def validate_even(value):
        if value == 'auth.User':
            raise ValidationError(
                _('%(value)s is not an even number'),
                params={'value': value},
            )

    class Post(models.Model):
        author = models.ForeignKey('auth.User')
        title = models.CharField(max_length=200)
        text = models.TextField()
        created_date = models.DateTimeField(default=timezone.now)
        published_date = models.DateTimeField(blank=True,null=True)

        def publish(self):
            self.published_date = timezone.now()
            self.save()

        def approve_comments(self):
            return self.comments.filter(approved_comment=True)

        def get_absolute_url(self):
            return reverse('post_detail', args=(), kwargs={'pk':self.pk})

        def __str__(self):
            return self.title

    class Comment(models.Model):
        post = models.ForeignKey('blog.post',related_name='comments')
        author = models.ForeignKey('auth.User')
        text = models.TextField()
        created_date = models.DateTimeField(default=timezone.now)
        approved_comment = models.BooleanField(default=False)

        def approve(self):
            self.approved_comment = True
            self.save()

        def get_absolute_url(self):
            return reverse('post_list')

        def __str__(self):
            return self.text

    class UserProfileInfo(models.Model):

        user = models.OneToOneField(User)

        def __str__(self):
            return self.user.username

我的views.py

from django import forms
from blog.models import Comment,Post
from django.contrib.auth.models import User
from blog.models import UserProfileInfo

class PostForm(forms.ModelForm):
    class Meta():
        model = Post
        fields = ['author','title','text']

        widgets = {
            'title':forms.TextInput(attrs={'class':'textinputclass','autocomplete':'true'}),
            'text':forms.Textarea(attrs={'class':'editable medium-editor-textarea postcontent'})
        }

class CommentForm(forms.ModelForm):
    class Meta():
        model = Comment
        fields = ['text']

        widgets = {
            'text':forms.Textarea(attrs={'class':'editable medium-editor-textarea'})
        }

    def __init__(self, *args, **kwargs):
        from django.forms.widgets import HiddenInput
        hide_condition = kwargs.pop('hide_condition',None)
        super(CommentForm, self).__init__(*args, **kwargs)
        if hide_condition:
            self.fields['author'].widget = HiddenInput()

class UserForm(forms.ModelForm):
    password = forms.CharField(widget=forms.PasswordInput(attrs={'autocomplete':'false'}))
    username = forms.CharField(widget=forms.TextInput(attrs={'autocomplete': 'false'}))

    class Meta():
        model = User
        fields = ('username', 'email', 'password')

        widgets = {
            'password':forms.TextInput(attrs={'autocomplete':'false'}),
            'username':forms.TextInput(attrs={'autocomplete':'false'}),
        }

我已经尝试过一切,没有任何效果。有人可以帮帮我吗?

1 个答案:

答案 0 :(得分:1)

PostForm中,从字段中删除author,以便用户无法对其进行编辑:

fields = ['title', 'text']

然后在CreatePostView中删除def get_queryset()方法,因为它不会在此处执行任何操作。您应该覆盖form_valid方法,在那里您有机会更新表单创建的模型。

def form_valid(self, form):
    self.object = form.save(commit=False)  # the form's save method returns the instance
    self.object.author = self.request.user  # here you assign the author
    self.object.save()
    return HttpResponseRedirect(self.get_success_url())

或者,尽可能接近CreateView父类:

def form_valid(self, form):
    form.instance.author = self.request.user
    return super().form_valid(form)  # this will call `CreateView`'s `form_valid()` method, which saves the form.