save () отсутствует 1 обязательный позиционный аргумент: 'self' в блоге django - PullRequest
0 голосов
/ 31 октября 2019

Я изучаю Django и работаю над системой комментариев.

Модель

class Comment(models.Model):
    post = models.ForeignKey(Post, on_delete=models.CASCADE, related_name='comments')
    comment_user = models.ForeignKey(User, on_delete=models.CASCADE)
    body = models.TextField()
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)
    active = models.BooleanField(default=True)

    class Meta:
        ordering = ('created',)

    def __str__(self):
        return 'comment by {} on {}'.format(self.comment_user, self.post)

Просмотры

def post_detail(request, year, month, day, post):
    post = get_object_or_404(Post, slug=post, status='published', publish__year=year, publish__month=month,
                             publish__day=day)

    comments = post.comments.filter(active=True)

    new_comment = None

    if request.method == 'POST':
        new_comment = CommentForm(request.POST)
        if CommentForm.is_valid:
            new_comment = CommentForm.save(commit=False)
            new_comment.post = post
            new_comment.comment_user = request.user
            new_comment.save()
        else:
            new_comment = CommentForm
    context = {
        'post': post,
        'comments':comments,
        'new_comment': new_comment,
        'CommentForm': CommentForm
    }
    return render(request, 'blog/post/detail.html', context)

Когда я пытаюсь создать новый комментарий, этовозникает ошибка

TypeError at /blog/2019/10/29/my-second-post/
save() missing 1 required positional argument: 'self'
Request Method: POST
Request URL:    http://127.0.0.1:8000/blog/2019/10/29/my-second-post/
Django Version: 2.2.6
Exception Type: TypeError
Exception Value:    
save() missing 1 required positional argument: 'self'
Exception Location: E:\v_envs\elkhashen\src\blog\views.py in post_detail, line 35
Python Executable:  E:\v_envs\elkhashen\Scripts\python.exe
Python Version: 3.7.4
Python Path:    
['E:\\v_envs\\elkhashen\\src',
 'E:\\v_envs\\elkhashen\\Scripts\\python37.zip',
 'E:\\v_envs\\elkhashen\\DLLs',
 'E:\\v_envs\\elkhashen\\lib',
 'E:\\v_envs\\elkhashen\\Scripts',
 'c:\\users\\elkhashen\\appdata\\local\\programs\\python\\python37-32\\Lib',
 'c:\\users\\elkhashen\\appdata\\local\\programs\\python\\python37-32\\DLLs',
 'E:\\v_envs\\elkhashen',
 'E:\\v_envs\\elkhashen\\lib\\site-packages']
Server time:    Thu, 31 Oct 2019 09:50:45 +0000

Ответы [ 2 ]

0 голосов
/ 31 октября 2019

Когда выполняется сохранение (commit = True), экземпляр из формы должен знать экземпляр из модели.

Вызов save_m2m () требуется только в том случае, если вы используете save (commit = False). Когда вы используете простую функцию save () в форме, все данные, включая данные многие-ко-многим, сохраняются без необходимости каких-либо дополнительных вызовов методов. Например:

# Create a form instance with POST data.
>>> a = Author()
>>> f = AuthorForm(request.POST, instance=a) <-- Set the instance model here

# Create and save the new author instance. There's no need to do anything else.
>>> new_author = f.save()

https://docs.djangoproject.com/en/2.2/topics/forms/modelforms/#the-save-method

0 голосов
/ 31 октября 2019
    if request.method == 'POST':
        new_comment = CommentForm(request.POST)
        if CommentForm.is_valid:
            new_comment = CommentForm.save(commit=False)   <--- THIS LINE
            new_comment.post = post
            new_comment.comment_user = request.user
            new_comment.save()
        else:
            new_comment = CommentForm

Там вы вызываете метод save() для класса, а не для экземпляра. Вы также предоставляете только ключевое слово аргумент.

Я не знаком с вашим большим приложением, поэтому не могу сказать, что именно код должен его заменить. Но, вероятно, вы должны использовать new_comment в строке около линии, которую я пометил, и, возможно, также отмеченную линию.

Если я не ошибаюсь, CommentFrom.is_valid - это либо свойство, либо метод. Если это метод, вы оцениваете логическое значение функции, которое всегда верно. Если это свойство, вы извлекаете свойство, а не следите за ним (поскольку вы смотрите на класс, а не на экземпляр). Это также всегда будет оцениваться как True.

Если это метод, эта строка, вероятно, должна быть new_comment.is_valid(). Если собственность, new_comment.is_valid.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...