У объекта 'Post' нет атрибута 'get_content_type' в приложении django Photo Blog - PullRequest
1 голос
/ 26 мая 2020

Я действительно заблудился и часами пытаюсь решить эту проблему. Я работаю над этой социальной сетью для фотографов, где они могут комментировать фотографии друг друга. Я настроил формы для комментариев, но получаю AttributeError: Объект 'Post' не имеет атрибута 'get_content_type' Это мой Views.py - photo_detail, где ошибка:

def photo_detail(request, id):
    instance = get_object_or_404(Post, id=id)
    comments = Socialmedia.objects.filter_by_instance(instance)
    initial_data = {
        "content_type": instance.get_content_type,
        "object_id": instance.id
    }
    socialmedia_form = SocialmediaForm(
        request.POST or None, initial=initial_data)
    if socialmedia_form.is_valid():
        print(socialmedia_form.cleaned_data)
    context = {
        "title": instance.title,
        "photo": instance.photo,
        "instance": instance,
        "comments": comments,
        "socialmedia_form": socialmedia_form,
    }
    return render(request, "photo_detail.html", context)

Когда я комментирую строку "content_type": instance.get_content_type, , ошибка исчезает, но после написания комментария требуется его поле с сообщением и ничего не публикуется, поэтому данные из комментария не загружаются. А вот мой models.py:

from django.db import models
from django.urls import reverse
from django.contrib.auth.models import User
from socialmedia.models import Socialmedia, SocialmediaManager
from django.contrib.contenttypes.models import ContentType


def upload_location(instance, filename):
    return '%s/%s' % (instance.id, filename)


class Post(models.Model):
    # category = models.ForeignKey(Type, blank=True, null=True, on_delete=models.CASCADE)
    user = models.ForeignKey(User, on_delete=models.CASCADE, default=1)
    title = models.CharField(max_length=200)
    updated = models.DateTimeField(auto_now=True, auto_now_add=False)
    time = models.DateTimeField(auto_now=False, auto_now_add=True)
    photo = models.ImageField(upload_to=upload_location,
                              null=True, blank=True,
                              height_field="height_field",
                              width_field="width_field")
    height_field = models.IntegerField(default=0)
    width_field = models.IntegerField(default=0)

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse("photo_detail", kwargs={"id": self.id})


    @property
    def get_content_type(self):
        instance = self
        content_type = ContentType.objects.get_for_model(instance.__class__)
        return content_type

И последняя страница photo_detail. html, где я пытаюсь это реализовать.

{% extends "base.html" %}


{% block content%}

    <div class="col-sm-8 col-sm-offset-6">
        {% if instance.photo %}
        <img src="{{ instance.photo.url }}"  class="img-responsive"/>
        {% endif %}
    <h1>{{ title }} </h1>
    <p>Author: {{ instance.user}}</p>
    <p><div class="fb-like" data-href="https://developers.facebook.com/docs/plugins/" data-width="" data-layout="button" data-action="like" data-size="small" data-share="true"></div></p>
    <br>
    <p>Updated : {{ instance.updated }}<br/></p>
    <p> Created :{{ instance.time }}<br/></p>

    <div>
    {{instance.comments.all}}
    <p class="lead">Comments</p>
    <form method="POST" action="."> {% csrf_token %}
    {{ socialmedia_form}}
    <input type="submit" value="Post" class="btn btn-default">
    </form>
    {% for comment in comments %}
    <div class="">
    {{ comment.content }}
    {{comment.user}} {{comment.time | timesince }} ago
    </div>
    {% endfor %}
    </div>

    </div>

{% endblock %}
...