我们假设我有以下网址: /valid/django/app/path/?foo=bar&spam=eggs
我可以在Django中模拟对此URL的请求:
from django.shortcuts import render
from django.core.urlresolvers import resolve
def simulate(request, url=None, template_name="not_important.html"):
if url:
dv = resolve(url.split('?')[0])
return dv.func(request, *dv.args, **dv.kwargs)
else:
return render(request, template_name)
Run Code Online (Sandbox Code Playgroud)
但是,我想将参数包含在包含的视图中,以便request.REQUEST和request.GET对象也包含foo
和spam
我看不出我怎么能干净利落地做到这一点; 据我所知,request.GET和request.REQUEST字典是不可变的,所以我不能只做以下事情:
import urlparse
def simulate(request, url=None, template_name="not_important.html"):
if url:
dv = resolve(url.split('?')[0])
qs = "".join(url.split('?')[1:])
if qs:
request.REQUEST.update(urlparse.parse_qs(qs))
request.GET.update(urlparse.parse_qs(qs))
return dv.func(request, *dv.args, **dv.kwargs)
else:
return render(request, template_name)
Run Code Online (Sandbox Code Playgroud)
或者我会收到错误消息
此QueryDict实例是不可变的
对于request.GET对象和
'MergeDict'对象没有属性'update'
对于request.REQUEST对象
如果有人想知道我为什么要这样做:我想允许用户填写表单,然后,当他们提交时,如果他们没有登录,它会将它们发送到包含原始URL的登录表单隐藏的领域.登录后,而不是重定向回到该链接(这将是一个GET请求),我希望它使用它最初具有的请求变量来调用原始视图,以便它可以使用相同的POST请求.
当然,在这个过程中,我也只是感兴趣的是,当给出该网站的有效URL时,是否可以模拟对Django视图的POST/GET请求.
一些背景优先.我正在使用以下"技巧"来防止不希望的浏览器缓存静态文件(CSS,JS等):
<script src="{{ STATIC_URL }}js/utils.js?version=1302983029"></script>
Run Code Online (Sandbox Code Playgroud)
当版本字符串在后续页面加载时发生更改时,它会使浏览器从服务器重新获取静态文件.(谷歌"css缓存"有关此技巧的文章.)
我希望浏览器获取最新版本的静态文件,但我还希望在文件未更改时允许浏览器缓存.换句话说,当且仅当静态文件已更新时,我希望更改版本字符串.我也想自动生成版本字符串.
为此,我使用静态文件的上次修改时间作为版本字符串.我正在制作一个自定义模板标签来执行此操作:
<script src="{% versioned_static 'js/utils.js' %}"></script>
Run Code Online (Sandbox Code Playgroud)
以下是模板标签的工作原理:
import os.path
from django import template
from django.conf import settings
class VersionedStaticNode(template.Node):
...
def render(self, context):
# With the example above, self.path_string is "js/utils.js"
static_file_path = os.path.join(settings.STATIC_ROOT, self.path_string)
return '%s?version=%s' % (
os.path.join(settings.STATIC_URL, self.path_string),
int(os.path.getmtime(static_file_path))
)
Run Code Online (Sandbox Code Playgroud)
要获取静态文件的上次修改时间,我需要知道它在系统上的文件路径.我通过连接settings.STATIC_ROOT
和来自该静态根的文件的相对路径来获取此文件路径.这对于生产服务器来说都很好,因为所有静态文件都是在收集的STATIC_ROOT
.
但是,在开发服务器上(使用manage.py runserver命令),不会收集静态文件STATIC_ROOT
.那么在开发中运行时如何获取静态文件的文件路径?
(为了澄清我的目的:我要避免的缓存情况是浏览器使用新HTML和旧CSS/JS的不匹配.在生产中,这可能会极大地混淆用户;在开发中,这会让我和其他开发人员混淆,并且我们经常刷新页面/清除浏览器缓存.)
我正在开发一个拥有典型Freelance Marketplace模型的网站的初始阶段.它有买家,卖家,交易,支付网关集成,评级,争议管理等.
而不是从头开始创建所有东西,我想知道是否有任何通用的django应用程序,我可以用作基础并在其上创建?
将自定义验证添加到Django 1.3中的表单字段,表单由通用视图CreateView创建.
class Picture(models.Model):
file = models.ImageField(upload_to=get_image_path)
filename = models.CharField(max_length=50, blank=True)
user = models.ForeignKey(User, editable=False)
upload_date = models.DateTimeField(auto_now_add=True,editable=False)
Run Code Online (Sandbox Code Playgroud)
class PictureCreateView(CreateView):
model = Picture
def clean_file(self,form):
if image:
if image._size > settings.MAX_IMAGE_SIZE:
raise ValidationError("Image file too large ( > 20mb )")
else:
raise ValidationError("Couldn't read uploaded image")
def get_form(self, form_class):
form = super(PictureCreateView, self).get_form(form_class)
form.instance.user = self.request.user
return form
def form_invalid(self, form):
...omitted none important code...
response = JSONResponse(data, {}, response_mimetype(self.request))
response['Content-Disposition'] = 'inline; filename=files.json'
return response
# …
Run Code Online (Sandbox Code Playgroud) 我想在我的ModelForm中过滤ManyToManyField选项:
class MyForm(forms.ModelForm):
class Meta:
model = Entity
fields = ['parent_entities']
def __init__(self, *args, **kwargs):
self.root_entity = kwargs.pop('root_entity')
self.Meta.fields['parent_entities'].queryset = Entity.objects.filter(root_entity=self.root_entity)
super(MyForm, self).__init__(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)
我尝试过很多我见过的不同代码,但还没有任何工作.
我想我的问题是我无法获得这个'parent_entities'字段.使用此代码,我有错误:
list indices must be integers, not str
Run Code Online (Sandbox Code Playgroud) 我有一个非常简单的模型:
class Badge(models.Model):
name = models.CharField(max_length=16, help_text="Name for Badge")
category = models.ForeignKey(BadgeCategory, help_text="Category for badge")
description = models.CharField(max_length=32, help_text="A brief description")
file = models.ImageField(upload_to=format_badge_name)
signals.post_save.connect(create_badge, sender=Badge)
Run Code Online (Sandbox Code Playgroud)
我知道在signals.py中我的create_badge函数有效.如果我发送它没有发送者的值,它说发件人是一个LogEntry对象.我想/需要在post_save脚本中引用一些实例信息,如下所示:
def create_badge(sender, instance, created, **kwargs):
from userinfuser.ui_api import UserInfuser
from django.conf import settings
if created:
api_key = settings.API_KEY
api_email = settings.API_EMAIL
ui = UserInfuser(api_email, api_key)
ui.create_badge(instance.category.name, instance.name, instance.description, instance.file.url)
Run Code Online (Sandbox Code Playgroud)
我在哪里可以调用我的post_save调用,以便它知道徽章(我假设这是修复?
谢谢.
我的Django应用程序中有一个页面需要执行以下操作之一,具体取决于登录用户与页面上显示的组(不是Django用户组;我的应用程序自定义内容)相关的状态:
这样做的一种方法是创建三个模板(一个带有连接链接,一个带有离开链接,一个没有链接),并在视图中选择合适的一个.我觉得有三个不同的模板只会在一行代码中有所不同可能有点过头了,所以我还没有走过那条路.
不能仅使用模板显示条件1和2的正确内容,如果是,我不认为这是可取的.用户到组是多对多关系,确定组成员资格需要将用户传递给组或将组传递给用户.
由于Django模板不允许传递函数参数,我试图通过使用传递上下文变量来解决这个问题get_context_data
.
def get_context_data(self, **kwargs):
context = super(NetworkDetails, self).get_context_data(**kwargs)
user = ???
context['in_group'] = user.in_group(context['group_detail'])
return context
Run Code Online (Sandbox Code Playgroud)
如果我这样做,如何在该方法中获取当前登录的用户?如果那是不可能的,我还可以在模板之外的哪些地方获取该信息?做这样的事情是否有可接受的方法?
谢谢!
# views.py
def like(request,option="food",restaurant = 1):
if request.is_ajax:
like = '%s_like' % str(option)
if 'restaurants' in request.session:
if restaurant not in request.session['restaurants']:
request.session['restaurants'][restaurant] = {}
x = request.session['restaurants'][restaurant].get(str(like),False)
if x:
return HttpResponse(False)
else:
request.session['restaurants'][restaurant][str(like)] = True
request.session.modified = True
else:
request.session['restaurants'] = {}
request.session.modified = True
Run Code Online (Sandbox Code Playgroud)
我正在使用,context_instance = RequestContext(request)
以便会话变量可用,同时渲染响应.我的模板:
{% if request.session.restaurants.rest.id.food_like %}
working
{% else %}
failed
{% endif %}
Run Code Online (Sandbox Code Playgroud)
我的视图会话密钥如下所示:
request.session["restaurants"][restaurant][like] = True
Run Code Online (Sandbox Code Playgroud)
restaurant
餐馆ID 在哪里,可能是"food_like","service_like","special_like"之一.
那么我应该如何在我的模板中访问它?例如,如果我使用
request.session.restaurants.rest.id.food_like
Run Code Online (Sandbox Code Playgroud)
它肯定不会起作用.
我有一个查询集结果,比如动物,它有一个动物列表.有动物的子类别,我想得到所有的子类别.即
对于单一动物,我可以使用animal.categories
哪种作品.现在,我想以某种方式这样做:
categories = animals.categories
Run Code Online (Sandbox Code Playgroud)
动物是查询集.我怎样才能做到这一点?
给定一个变量,其中包含巴黎时区 2000-01-01 00:01 的日期时间(据我所知,冬季为 UTC+2):
datetime.datetime(2000, 1, 1, 0, 1, tzinfo=pytz.timezone('Europe/Paris'))
Run Code Online (Sandbox Code Playgroud)
我预计转换为 UTC 会得到 1999-12-31 22:01 的日期时间,但得到的却是:
datetime.datetime(2000, 1, 1, 0, 1, tzinfo=pytz.timezone('Europe/Paris')).astimezone(pytz.utc)
datetime.datetime(1999, 12, 31, 23, 52, tzinfo=<UTC>)
Run Code Online (Sandbox Code Playgroud)
我缺少什么?
python ×10
django ×9
django-forms ×2
django-views ×2
datetime ×1
django-orm ×1
django-urls ×1
reusability ×1
static-files ×1