Python 如何在Django';什么是框架工作?

Python 如何在Django';什么是框架工作?,python,django,django-comments,Python,Django,Django Comments,我真的不理解Django的评论框架 我使用Django的注释为我的类Order创建了一些注释,默认情况下,它会显示一个类似/comments/cr/18/1/#c1的url,而该url从不存在 我看了评论的url.py,它有一行写着 urlpatterns += patterns('', url(r'^cr/(\d+)/(.+)/$', 'django.contrib.contenttypes.views.shortcut', name='comments-url-redirect'),

我真的不理解Django的评论框架

我使用Django的注释为我的类
Order
创建了一些注释,默认情况下,它会显示一个类似
/comments/cr/18/1/#c1
的url,而该url从不存在

我看了评论的
url.py
,它有一行写着

urlpatterns += patterns('',
    url(r'^cr/(\d+)/(.+)/$', 'django.contrib.contenttypes.views.shortcut', name='comments-url-redirect'),
)
具有
快捷方式的
views.py
方法是

from django import http
from django.contrib.contenttypes.models import ContentType
from django.contrib.sites.models import Site, get_current_site
from django.core.exceptions import ObjectDoesNotExist
from django.utils.translation import ugettext as _

def shortcut(request, content_type_id, object_id):
    """
    Redirect to an object's page based on a content-type ID and an object ID.
    """
    # Look up the object, making sure it's got a get_absolute_url() function.
    try:
        content_type = ContentType.objects.get(pk=content_type_id)
        if not content_type.model_class():
            raise http.Http404(_(u"Content type %(ct_id)s object has no associated model") %
                               {'ct_id': content_type_id})
        obj = content_type.get_object_for_this_type(pk=object_id)
    except (ObjectDoesNotExist, ValueError):
        raise http.Http404(_(u"Content type %(ct_id)s object %(obj_id)s doesn't exist") %
                           {'ct_id': content_type_id, 'obj_id': object_id})

    try:
        get_absolute_url = obj.get_absolute_url
    except AttributeError:
        raise http.Http404(_("%(ct_name)s objects don't have a get_absolute_url() method") %
                           {'ct_name': content_type.name})
    absurl = get_absolute_url()

    # Try to figure out the object's domain, so we can do a cross-site redirect
    # if necessary.

    # If the object actually defines a domain, we're done.
    if absurl.startswith('http://') or absurl.startswith('https://'):
        return http.HttpResponseRedirect(absurl)

    # Otherwise, we need to introspect the object's relationships for a
    # relation to the Site object
    object_domain = None

    if Site._meta.installed:
        opts = obj._meta

        # First, look for an many-to-many relationship to Site.
        for field in opts.many_to_many:
            if field.rel.to is Site:
                try:
                    # Caveat: In the case of multiple related Sites, this just
                    # selects the *first* one, which is arbitrary.
                    object_domain = getattr(obj, field.name).all()[0].domain
                except IndexError:
                    pass
                if object_domain is not None:
                    break

        # Next, look for a many-to-one relationship to Site.
        if object_domain is None:
            for field in obj._meta.fields:
                if field.rel and field.rel.to is Site:
                    try:
                        object_domain = getattr(obj, field.name).domain
                    except Site.DoesNotExist:
                        pass
                    if object_domain is not None:
                        break

    # Fall back to the current site (if possible).
    if object_domain is None:
        try:
            object_domain = get_current_site(request).domain
        except Site.DoesNotExist:
            pass

    # If all that malarkey found an object domain, use it. Otherwise, fall back
    # to whatever get_absolute_url() returned.
    if object_domain is not None:
        protocol = request.is_secure() and 'https' or 'http'
        return http.HttpResponseRedirect('%s://%s%s'
                                         % (protocol, object_domain, absurl))
    else:
        return http.HttpResponseRedirect(absurl)
这太复杂了,我无法理解

当Django说permalink时,我考虑在页面上引用一个特定的位置(通常是标题)。例如,Django的评论框架文档是link#1,您可以将“linkingtocomments”部分永久链接到link#2

那么对于评论,不应该是一样的吗?URL不应该只是一个
#c1
或者没有
/comments/cr/18/1/…
的东西吗?事实上,我甚至不知道Django从哪里得到了
18
1
。。。通过
快捷方式
方法,我了解到
18
content\u-type\u-id
1
object\u-id
,但我如何分辨
模型中的哪个类。py
是哪个content-type-id和object-id

那么对于评论,不应该是一样的吗?URL不应该只是一个#c1或没有/comments/cr/18/1/…的东西吗。。。?事实上我甚至不知道Django从哪里得到了18分和1分。。。从快捷方式方法中,我了解到18是内容类型id,1是

18是内容类型id,1是对象id。快捷方式视图使用这些参数从数据库获取对象,并重定向到
modelobject.get\u absolute\u url()

定义/修复模型中的get\u absolute\u url()方法,这将修复
django.contrib.contenttypes.views.shortcut


也就是说,Django希望模型对象的url显示该对象的注释列表。在这种情况下,只需在您的单个注释HTML中添加

注释框架用于将
注释
对象链接到您的数据库对象(
案例中的排序
模型)。泛型关系允许一个对象与另一个对象保持关系,而无需明确知道它的类。您可以在此处看到创建注释通用关系(内容类型、对象主键、内容对象)的字段:

一旦某个注释被创建并附加到某个特定类的实例(例如单个
顺序
),我们就需要一种方法来获取指向该特定注释的链接(permalink)。要获得评论的链接,我们需要知道评论对象的URL(同样,在您的案例中,特定的
顺序)。这就是
get\u comment\u permalink
所做的-它构造了一个指向对象的URL,该对象的注释已保留在该URL上,并将锚链接(c1
部分)附加到该URL,以便浏览器跳到该页面上的特定注释

要完成所有这些,它有3个步骤:

  • 首先通过查找泛型关系来确定它处理的对象类型。这将给我们留下一个
    订单
    对象
  • 现在它尝试获取该对象的绝对url。这可能是/订单/我的订单/
  • 它构造了`http://mysite.com/'使用站点框架创建URL的一部分
  • 它计算出url的#c31(指向评论的锚定链接)部分

现在我们有了一个完整的页面,它将带我们进入正确的页面,并显示正确的注释

这似乎不违反干夹/松耦合吗?我已经在我的
models.py
中定义了
def-get\u-absolute\u-url(self):return“/doors/orders/{pk}/”.format(pk=self.pk)
,并在我的doors应用程序中定义了
r'^orders/(?P\d+/$”
)。有没有办法扭转这一点?这是另一个问题,所以我会简短地回答,但是,你是对的!您只需执行类似的操作即可从django.core import urlresolvers获取url:
;urlResolver.reverse('doors\u order\u detail',args=[self.pk])
。当然,这需要“doors\u order\u detail”,这在Django中是相当标准的。感谢您对泛型关系的解释!
1. https://docs.djangoproject.com/en/dev/ref/contrib/comments/
2. https://docs.djangoproject.com/en/dev/ref/contrib/comments/#linking-to-comments