如果我有以下控制器:
function parent($scope, service) {
$scope.a = 'foo';
$scope.save = function() {
service.save({
a: $scope.a,
b: $scope.b
});
}
}
function child($scope) {
$scope.b = 'bar';
}
Run Code Online (Sandbox Code Playgroud)
什么是让你parent
读b
出来的正确方法child
?如果有必要定义b
中parent
,也不会使它语义上不正确假设b
是描述相关的东西的属性child
,而不是parent
?
更新:进一步思考它,如果有一个以上的孩子b
,它将产生一个冲突parent
,b
以便检索.我的问题是,什么是访问的正确方法是b
从parent
?
我正在使用Twitter Bootstrap,我有以下内容:
<div class="row">
<div class="span3">
<div data-spy="affix">
<form>
<!-- inputs and stuff -->
</form>
</div>
</div>
<!-- span9 and its contents -->
</div>
Run Code Online (Sandbox Code Playgroud)
Bootstrap正确应用了词缀效果,<div>
当我向下滚动页面时它保持静止.但是,一旦我将页面调整为移动尺寸并引导自适应响应效果(导航栏折叠/对象在彼此之下很好地对齐),粘贴<div>
现在位于页面的其他元素之上并且它变得混乱.这是发生,因为.affix
有position: fixed
这解释了它相当不错.
现在我去了Bootstrap的网站,并将页面调整为移动尺寸,附加元素(<ul>
在他们的情况下)开始与页面很好地流动,采取其自然的位置,而不是在其他元素之上.我也注意到,一旦出现这种情况,则类是从变affix
到affix-top
.
我不确定这是否是他们的自定义或者它是否是框架的一部分,因为框架显然不是以相同的方式运行.任何人都可以详细说明这个吗?我需要在我的<div>
位置具有相同的行为如果页面被调整为移动尺寸,则附加元素占据其自然位置.
编辑:我的观察有点缺陷.我注意到他们页面上的元素最初有affix-top
,一旦我在data-top-offset
它下面滚动它就会改变affix
.它仍然无法解释为什么我<div>
不会像<ul>
调整大小时那样渲染.
在后端将值从后端传递给AngularJS的最佳方法是什么?我正在使用Django并且模板能够吐出我需要的值,但是我不确定将这些值传递给AngularJS的最佳做法是什么.
想想一篇博客文章及其评论,如果我有一个AngularJS服务,通过将帖子ID传递给服务来检索某个博客文章的所有评论,Django正在呈现HTML模板,它确实知道帖子ID是什么,但是我需要将此帖子ID传递给AngularJS,然后传递给服务.
一个想法是将其隐藏<input>
并将此输入分配给模型.不太吸引人.
另一个是有一个指令并将一个属性中的这个值传递给这个指令,这样我就可以访问这个属性的值:
// Django (or any backend) is rendering {{ object.value }}
<div class="myDirective" data-object-id={{ object.value }}>
...
</div>
angular.module('myDirectives', []).
directive('myDirective', function() {
return {
restrict: 'C',
transclude: false,
link: function postLink($scope, $element, $attrs) {
// $attrs.objectId would have the value
}
}
});
Run Code Online (Sandbox Code Playgroud)
这两种方法看起来很好.但我想知道是否有更清洁的方法这样做?遵循AngularJS最佳实践的任何方法?
我有一个具有可选字段的对象.我用这种方式定义了我的序列化器:
class ProductSerializer(serializers.Serializer):
code = serializers.Field(source="Code")
classification = serializers.CharField(source="Classification", required=False)
Run Code Online (Sandbox Code Playgroud)
如果它不存在,我认为 required=False
可以绕过该字段.但是,文档中提到这会影响反序列化而不是序列化.
我收到以下错误:
'Product' object has no attribute 'Classification'
Run Code Online (Sandbox Code Playgroud)
当我尝试访问.data
序列化实例时会发生这种情况.(这是不是意味着反序列化提高了这个?)
这种情况发生在没有的情况下Classification
.如果我省略Classification
了序列化程序类,它可以正常工作.
我该如何正确地做到这一点?使用可选字段序列化对象,即.
最初,我像这样开始我的UserProfile:
from django.db import models
from django.contrib.auth.models import User
class UserProfile(models.Model):
user = models.OneToOneField(User)
verified = models.BooleanField()
mobile = models.CharField(max_length=32)
def __unicode__(self):
return self.user.email
Run Code Online (Sandbox Code Playgroud)
哪个适用于AUTH_PROFILE_MODULE = 'accounts.UserProfile'
设置settings.py
.
但是,我的网站中有两种不同的用户,个人和企业,每个都有自己独特的属性.例如,我希望我的个人用户只有一个用户,因此拥有user = models.OneToOneField(User)
,而对于企业,我希望他们有多个用户与相同的个人资料相关,所以我会user = models.ForeignKey(User)
改为.
所以我考虑将模型分成两个不同的模型,IndivProfile
并且CorpProfile
都继承自UserProfile
将模型特定的属性移动到相关的子模型中.对我来说似乎是一个好主意并且可能会有效,但是我无法指定AUTH_PROFILE_MODULE
这种方式,因为我有两个不同用户的用户配置文件.
我也考虑过这样做,UserProfile
从多个类(模型)继承,如下所示:
class UserProfile(IndivProfile, CorpProfile):
# some field
def __unicode__(self):
return self.user.email
Run Code Online (Sandbox Code Playgroud)
这样我就可以设置AUTH_PROFILE_MODULE = 'accounts.UserProfile'
并解决它的问题.但是看起来它看起来不会起作用,因为python中的继承从左到右工作,所有变量IndivProfile
都占主导地位.
当然,我总是可以将一个模型IndivProfile
和CorpProfile
变量全部混合在一起,然后我会在必要时使用所需的模型.但这对我来说看起来并不干净,我宁愿让它们隔离并在适当的地方使用适当的模型.
的任何建议清洁这样的方式?
在settings.py
我有:
STATICFILES_STORAGE = 'storages.backends.s3boto.S3BotoStorage'
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto.S3BotoStorage'
AWS_ACCESS_KEY_ID = 'xxxxxxxxxxxxx'
AWS_SECRET_ACCESS_KEY = 'xxxxxxxxxxxxx'
AWS_STORAGE_BUCKET_NAME = 'static.mysite.com'
Run Code Online (Sandbox Code Playgroud)
这指向我的S3存储桶static.mysite.com
并且在我这样做时工作正常manage.py collectstatic
,它将所有静态文件上传到我的存储桶.不过,我还有一个水桶,我用不同的目的,想如果我有这样的模型在网站的某些地区使用,例如:
class Image(models.Model):
myobject = models.ImageField(upload_to='my/folder')
Run Code Online (Sandbox Code Playgroud)
现在Image.save()
调用它时,它仍会将文件上传到S3存储桶中AWS_STORAGE_BUCKET_NAME
,但是我希望它Image.save()
指向另一个S3存储桶.任何清洁这样的方式?我不想改变settings.py
运行时间,也不想实现任何违反django关键原则的做法,即具有可插入的易于更改的后端存储.
以下代码在保存后拍摄图像并从中制作缩略图:
class Image(models.Model):
image = models.ImageField(upload_to='images')
thumbnail = models.ImageField(upload_to='images/thumbnails', editable=False)
def save(self, *args, **kwargs):
super(Image, self).save(*args, **kwargs)
if self.image:
from PIL import Image as ImageObj
from cStringIO import StringIO
from django.core.files.uploadedfile import SimpleUploadedFile
try:
# thumbnail
THUMBNAIL_SIZE = (160, 160) # dimensions
image = ImageObj.open(self.image)
# Convert to RGB if necessary
if image.mode not in ('L', 'RGB'): image = image.convert('RGB')
# create a thumbnail + use antialiasing for a smoother thumbnail
image.thumbnail(THUMBNAIL_SIZE, ImageObj.ANTIALIAS)
# fetch image into memory
temp_handle = …
Run Code Online (Sandbox Code Playgroud) 在我的models.py中:
from django.db import models
from core import tasks
class Image(models.Model):
image = models.ImageField(upload_to='images/orig')
thumbnail = models.ImageField(upload_to='images/thumbnails', editable=False)
def save(self, *args, **kwargs):
super(Image, self).save(*args, **kwargs)
tasks.create_thumbnail.delay(self.id)
Run Code Online (Sandbox Code Playgroud)
在我的tasks.py中:
from celery.decorators import task
from core.models import Image
@task()
def create_thumbnail(image_id):
ImageObj = Image.objects.get(id=image_id)
# other stuff here
Run Code Online (Sandbox Code Playgroud)
这将返回以下内容:
如果我注释掉错误消失from core.models import Image
的tasks.py
,但是这显然会造成一个问题,因为Image
在这里没有任何意义.我试图在里面导入它,create_thumbnail
但它仍然无法识别Image
.
我已经读过某个地方,通常对象本身可以作为参数传递给任务,这将解决我的问题.但是,一位朋友曾告诉我,在RabbitMQ消息中尽可能少地发送数据被认为是最佳做法,所以为了实现这一点,我试图只传递图像ID,然后在任务中再次检索它.
1)我正在尝试做的是最佳做法吗?如果是,我该如何解决?
2)我注意到在网络上发现的所有示例中,他们从视图执行任务,而不是从模型执行任务.我正在尝试在上传新图像时创建缩略图,我不想在我拥有的每个表单/视图中调用create_thumbnail.有什么想法吗?是从不推荐的模型执行任务还是通常的做法?
我创建了一个自定义存储后端,该文件被调用storages.py
并放置在一个名为的应用程序中core
:
from django.conf import settings
from storages.backends.s3boto import S3BotoStorage
class S3StaticBucket(S3BotoStorage):
def __init__(self, *args, **kwargs):
kwargs['bucket_name'] = getattr(settings, 'static.mysite.com')
super(S3BotoStorage, self).__init__(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)
在settings.py
,我有以下内容:
STATICFILES_STORAGE = 'core.storages.S3StaticBucket'
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto.S3BotoStorage'
Run Code Online (Sandbox Code Playgroud)
当我尝试这样做python manage.py collectstatic
时显示以下错误:
django.core.exceptions.ImproperlyConfigured: Error importing storage module core.storages: "No module named backends.s3boto"
Run Code Online (Sandbox Code Playgroud)
当我运行python manage.py shell
并尝试导入相同的:
>>>
>>> from django.conf import settings
>>> from storages.backends.s3boto import S3BotoStorage
>>>
Run Code Online (Sandbox Code Playgroud)
知道我做错了什么吗?
我有一个下拉列表:
<select
ng-model="filter.country"
ng-options="country.code as country.name for country in countries"
ng-change="broadcast()">
<option value="">All Countries</option>
</select>
Run Code Online (Sandbox Code Playgroud)
$scope.countries
最初由服务填充,然后另一个下拉更改事件将$scope.countries
通过再次调用服务来限制值,通过另一个下拉列表的选定项.
这里的问题是什么时候$scope.filter.country
绑定了一个值(默认值除外)并$scope.countries
更新到一个不包含$scope.filter.country
值的新列表.我可以看到国家/地区下拉列表恢复其默认选项"所有国家/地区",但$scope.filter.country
仍保持原样.
关于这种情况的任何想法?不应该$scope.filter.country
更新回到默认值?
更新:这是一个小提琴
更新:
为了说明这一点,这里是一个小提琴的截图:
这对我来说看起来像个错误,我已经为它开了一个问题.
django ×6
angularjs ×3
amazon-s3 ×1
celery ×1
django-users ×1
javascript ×1
python ×1
rabbitmq ×1