非常基本的问题,但我无法在网上追踪答案.我有一个模板,我想链接到django管理站点(即localhost:8000/admin).这是什么代码?
我在想象类似的东西
<a href="{% url admin.site.root %}">link to admin panel</a>
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试上面的代码片段时,我得到:
Caught an exception while rendering:
Reverse for 'project_name.django.contrib.admin.sites.root' with
arguments '()' and keyword arguments '{}' not found.
Run Code Online (Sandbox Code Playgroud)
救命?
从Django文档......
当您只处理简单的多对多关系时,例如混合和匹配比萨饼和浇头,您只需要一个标准的ManyToManyField即可.但是,有时您可能需要将数据与两个模型之间的关系相关联.
例如,考虑应用程序跟踪音乐家所属的音乐组的情况.一个人与他们所属的组之间存在多对多关系,因此您可以使用ManyToManyField来表示此关系.但是,您可能希望收集的成员资格有很多详细信息,例如此人加入该组的日期.
对于这些情况,Django允许您指定将用于管理多对多关系的模型.然后,您可以在中间模型上添加额外的字段.中间模型与ManyToManyField相关联,使用through参数指向将充当中介的模型.对于我们的音乐家示例,代码看起来像这样:
class Person(models.Model):
name = models.CharField(max_length=128)
def __unicode__(self):
return self.name
class Group(models.Model):
name = models.CharField(max_length=128)
members = models.ManyToManyField(Person, through='Membership')
def __unicode__(self):
return self.name
class Membership(models.Model):
person = models.ForeignKey(Person)
group = models.ForeignKey(Group)
date_joined = models.DateField()
invite_reason = models.CharField(max_length=64)
Run Code Online (Sandbox Code Playgroud)
现在您已经设置了ManyToManyField以使用您的中间模型(在这种情况下为Membership),您已准备好开始创建一些多对多关系.您可以通过创建中间模型的实例来完成此操作:
ringo = Person.objects.create(name="Ringo Starr")
paul = Person.objects.create(name="Paul McCartney")
beatles = Group.objects.create(name="The Beatles")
m1 = Membership(person=ringo, group=beatles,
... date_joined=date(1962, 8, 16),
... invite_reason= "Needed a new drummer.")
m1.save()
beatles.members.all()
[<Person: Ringo Starr>]
ringo.group_set.all()
[<Group: The Beatles>]
m2 = Membership.objects.create(person=paul, group=beatles, …Run Code Online (Sandbox Code Playgroud) 我正在编写一个ToDo列表应用程序,以帮助自己开始使用Python.该应用程序在GAE上运行,我将待办事项存储在数据存储中.我想向他们展示每个人的项目,而且他们一个人.问题是该应用程序当前向所有用户显示所有项目,因此我可以看到您所写的内容,并且您可以看到我写的内容.我想把我的todo.author对象转换成一个字符串,看看它是否与用户名相匹配将是一个好的开始,但我无法弄清楚如何做到这一点.
这就是我在main.py中的内容
...
user = users.get_current_user()
if user:
nickname = user.nickname()
todos = Todo.all()
template_values = {'nickname':nickname, 'todos':todos}
...
def post(self):
todo = Todo()
todo.author = users.get_current_user()
todo.item = self.request.get("item")
todo.completed = False
todo.put()
self.redirect('/')
Run Code Online (Sandbox Code Playgroud)
在我的index.html中我最初有这个:
<input type="text" name="item" class="form-prop" placeholder="What needs to be done?" required/>
...
<ul>
{% for todo in todos %}
<input type="checkbox"> {{todo.item}} <hr />
{% endfor %}
</ul>
Run Code Online (Sandbox Code Playgroud)
但我想只向创建它们的用户显示项目.我想过尝试
{% for todo in todos %}
{% ifequal todo.author nickname %}
<input type="checkbox"> {{todo.item}} <hr /> …Run Code Online (Sandbox Code Playgroud) 已经询问了这个问题的变化,但是当我的模板被渲染时,我仍然无法正确加载我的样式表.
我正在尝试在开发过程中从Django进程中提供静态媒体 - 这在生产中是非常不鼓励的,我知道.我会发布我的配置和模板,希望有人可以帮我理解我哪里出错了.
请注意,我确实尝试按照Django项目网站上的示例进行操作,但是没有提到如何从模板中引用样式表.我也尝试过同一件事的许多不同变体,所以我的代码/设置可能与描述的有些不同.
settings.py
MEDIA_ROOT = 'D:/Dev Tools/django_projects/dso/media'
MEDIA_URL = '/media/'
ADMIN_MEDIA_PREFIX = '/media/'
Run Code Online (Sandbox Code Playgroud)
urls.py
from django.conf.urls.defaults import *
from django.conf import settings
from django.contrib import admin
admin.autodiscover()
urlpatterns = patterns('',
(r'^admin/(.*)', admin.site.root),
(r'^ovramt/$', 'dso.ovramt.views.index'),
)
if settings.DEBUG:
urlpatterns += patterns('',
(r'^media/(?P<path>.*)$', 'django.views.static.serve', {'document_root': settings.MEDIA_ROOT}),
)
Run Code Online (Sandbox Code Playgroud)
在我的模板中:
<head>
<title> {% block title %} DSO Template {% endblock %} </title>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" >
<link rel="stylesheet" type="text/css" href="../media/styles.css">
</head>
Run Code Online (Sandbox Code Playgroud)
我向你保证,文件(模板/媒体)位于我文件系统的正确目录中.如果我需要提供任何额外信息,请发表评论.
编辑:
我遇到的一个问题是使用'/'前置我的链接.如果前缀为正斜杠,则从站点的根目录打开链接.如果没有正斜杠,则链接在当前级别打开.一个例子:
www.example.com/application/有一个链接"/ app2 /和一个链接"app3
/".app2将在www.example.com/app2/上打开,app3将在www.example.com/application/app3/上打开我觉得这让我感到困惑.
我试图在项目列表上输出描述的前255个字符,我正在寻找一种方法来获得它.
示例:我有一个包含300个左右字符的变量.
我叫这个变量, {{ my_variable|characterlimit:255 }}
它只返回该变量的前255个字符.
如果这个标签不存在,我将简单地创建它(并建议它进入django),但我想确保在我花时间做之前没有.谢谢!
EMP_CHOICES = (
(0,'-- Select --'),
(1,'Good'),
(2,'Average'),
)
class EMPFeedback(models.Model):
user_choices = models.IntegerField(choices=EMP_CHOICES)
Run Code Online (Sandbox Code Playgroud)
如果存储在db中的值为1,则user_choices如何打印相应的user_choices对应的值(即1 == GOOD)
fb = EMPFeedback.objects.get(id=1)
print fb.user_choices # prints 1
print fb.user_choices.EMP_CHOICES
Run Code Online (Sandbox Code Playgroud) 当您事先不知道某个属性的名称时,Python的getattr()方法很有用.
这个功能在模板中也会派上用场,但我从来没有想过要做到这一点的方法.是否有可以执行动态属性查找的内置标记或非内置标记?
我想将日期与Django中的当前日期进行比较,最好是在模板中,但在渲染模板之前也可以这样做.如果日期已经过去,我想说"过去",如果是将来,我想给出日期.
我希望有人可以这样做:
{% if listing.date <= now %}
In the past
{% else %}
{{ listing.date|date:"d M Y" }}
{% endif %}
Run Code Online (Sandbox Code Playgroud)
现在是今天的日期,但这不起作用.我在Django文档中找不到任何相关内容.谁能提出一些建议?
如果要覆盖django中的应用程序附带的模板(在app/templates/app /中),则在另一个目录中创建一个同名模板,模板加载器在应用程序的模板目录之前检查该模板.如果您只想覆盖模板的某些块,您还必须复制整个模板广告更改该块,这实际上不是很干.
有没有人知道覆盖orginial模板的方法,同时在扩展它时,你只需要覆盖你想要改变的特定块?(事情是这样做而不更改模板的名称,因为在某些情况下,您可能必须更改视图以使其与另一个模板一起使用)
编辑:正如亚当泰勒在Django 1.9的评论中所指出的,这可能没有任何黑客攻击.
在Django模板中,您可以使用{{ _("Hello World") }}或{% trans "Hello World" %}标记要翻译的字符串.在文档中,"官方"方法似乎是{% trans %}标记,但_()语法也提到过一次.
这些方法有何不同(语法除外)以及为什么应该优先于其他方法?
一个区别是你显然不能使用{% trans %}标签和过滤器.但这是否意味着我可以_()随处使用,比如{{ _("String") }}?与使用{% trans "String" %}独立字符串以及_()标签和过滤器相比,它更加干净,更加一致.
django-templates ×10
django ×9
python ×6
css ×1
django-admin ×1
django-urls ×1
django-views ×1
many-to-many ×1
media ×1
relationship ×1
translation ×1