我正在开发一个GeoDjango应用程序,用户可以在其中上传地图文件并执行一些基本的映射操作,例如查询多边形内的要素。
我认识到用户有时会上传“ MultiLineString”而不是“ Polygon”。这会导致期望封闭几何的查询失败。
在Python中将MultiLineString对象转换为Polygon的最佳方法是什么?
谢谢。
-oMat
我想像ManyToManyField管理员一样在管理员中显示s filter_horizontal,但是当用户键入过滤器字段时填充选项.有很多选项,一次加载它们需要花费很多时间.
我找到了django-ajax-filtered-fields,但在我看来它是一种矫枉过正,因为它需要更改模型类,当我想要做的就是替换表单中的每个多个select字段.
编写继承的自定义窗口小部件字段admin.widgets.FilteredSelectMultiple似乎是正确的方法.所以我试图推出自己的小部件:
class MultiSelectWidget(FilteredSelectMultiple):
class Media:
# here should be some js to load options dynamically
js = (
"some_js_to_load_ajax_options.js",
)
def render_options(self, choices, selected_choices):
# this initializes the multiple select without any options
choices = [c for c in self.choices if str(c[0]) in selected_choices]
self.choices = choices
return super(MultiSelectWidget,
self).render_options([], selected_choices)
class MyAdminForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(MyAdminForm, self).__init__(*args, **kwargs)
self.fields['m2m_field'].widget = MultiSelectWidget('m2m_field', is_stacked=False)
class Meta:
model = MyModel
class …Run Code Online (Sandbox Code Playgroud) 我有2个这样的多表继承模型:
class Post(models.Model):
title = models.CharField(max_length=100, blank=True, null=True)
text = models.TextField(blank=True, null=True)
location = models.PointField()
...
class BlogPost(Post):
blog = models.ForeignKey(Blog)
Run Code Online (Sandbox Code Playgroud)
同样,BlogPost的表单类也继承自PostForm类:
class PostForm(MapModelForm):
...
class Meta:
model = Post
def clean(self):
...
class BlogPostForm(PostForm):
class Meta:
model = BlogPost
Run Code Online (Sandbox Code Playgroud)
我曾经在两个非基于类的视图中处理两个模型的创建/更新.为了让事情变得干燥,我决定尝试给Django基于类的通用视图.但由于缺乏相关文件的例子和用户不友好以及各种方法,我很困惑.
我们的想法是为Post模型提供基于类的表单视图,并为其继承它们BlogPost.我该如何定制视图类?
我应该有单独的PostCreate和PostUpdate视图吗?然后这两个类几乎完全相同,而不是DRY.
我是否应该单独FormView更新/创建帖子?它适用于创建,但我无法弄清楚如何进行更新.
我应该使用提供的mixin类而不是直接从视图继承来构建自定义视图(或创建/更新的两个视图)吗?
我试图根据两个DateTimeFields的时间差来获取帖子,例如,在发布后不到 10 分钟内删除的帖子。
class Post(models.Model):
...
time_posted = models.DateTimeField()
time_deleted = models.DateTimeField(blank=True, null=True)
Run Code Online (Sandbox Code Playgroud)
有了上面的模型,我试过了;
from datetime import timedelta
Post.objects.exclude(deleted__isnull=True).annotate(
delta=F('time_deleted') - F('time_posted')
).filter(delta__lt=timedelta(minutes=10))
Run Code Online (Sandbox Code Playgroud)
并得到了一个TypeError: expected string or buffer. 然后我认为这可能是类型的变化(DateTime 对象产生 Time 对象)所以我尝试了ExpressionWrapper:
Post.objects.exclude(deleted__isnull=True).annotate(
delta=models.ExpressionWrapper(
F('time_deleted') - F('time_posted'),
output_field=models.TimeField())
).filter(delta__gt=timedelta(minutes=10))
Run Code Online (Sandbox Code Playgroud)
但这也导致了同样的异常。
任何帮助深表感谢。
编辑
根据@ivan 的建议,我DurationField()改为尝试。我不再遇到异常,但 delta 总是0.
>>> post = Post.objects.exclude(deleted__isnull=True).annotate(
delta=ExpressionWrapper(F('deleted') - F('time'),
output_field=DurationField())
).first()
>>> post.time_posted
datetime.datetime(2015, 8, 24, 13, 26, 50, 857326, tzinfo=<UTC>)
>>> post.time_deleted
datetime.datetime(2015, 8, 24, …Run Code Online (Sandbox Code Playgroud) 我有一个Django ModelForm,它通过一个模型来公开对应于多对多关系的多选字段,该模型将order选择(文档列表)作为额外属性.在前端,该字段显示为两个与admin中类似的多个选择字段,一个列出可用选项,另一个列出所选元素.
可以使用正确的元素选择保存表单,但它们始终按原始选择顺序排列,而不是选择顺序.浏览器以正确的顺序发送选择,但顺序输入form.cleaned_data['documents']始终是原始顺序的顺序.
如何使MultipleChoiceField尊重所选元素的顺序?
谢谢.
我必须遗漏一些明显的东西,因为这种简单的要求不符合预期.这是我的模型类:
class Encounter(models.Model):
activity_type = models.CharField(max_length=2,
choices=(('ip','ip'), ('op','op'), ('ae', 'ae')))
cost = models.DecimalField(max_digits=8, decimal_places=2)
Run Code Online (Sandbox Code Playgroud)
我想找到每种活动类型的总费用.我的查询是:
>>> Encounter.objects.values('activity_type').annotate(Sum('cost'))
Run Code Online (Sandbox Code Playgroud)
产量:
>>> [{'cost__sum': Decimal("140.00"), 'activity_type': u'ip'},
{'cost__sum': Decimal("100.00"), 'activity_type': u'op'},
{'cost__sum': Decimal("0.00"), 'activity_type': u'ip'}]
Run Code Online (Sandbox Code Playgroud)
在结果集中有2个'ip'类型遇到.这是因为它不是仅activity_type按活动类型和成本分组,而是没有给出预期结果.生成的SQL查询是:
SELECT "encounter_encounter"."activity_type",
SUM("encounter_encounter"."total_cost") AS "total_cost__sum"
FROM "encounter_encounter"
GROUP BY "encounter_encounter"."activity_type",
"encounter_encounter"."total_cost" <<<< THIS MESSES THINGS
ORDER BY "encounter_encounter"."total_cost" DESC
Run Code Online (Sandbox Code Playgroud)
如何使这个查询按预期工作(如果我没有弄错的话,如文档所暗示的那样)并使它只进行一个分组activity_type?
我想在管理中提供一个与 非常相似的自定义视图changelist_view(),但没有指向编辑表单视图的链接。用户将能够选择列表中的项目并应用操作,就像在更改列表表单中一样,但他们无权访问编辑表单。
我认为ModelAdmin类中的结构应该是这样的:
class ProductAdmin(admin.ModelAdmin):
def get_urls(self):
urls = super(ProductAdmin, self).get_urls()
urls += patterns('',
(r'^selectlist/$', self.selectlist_view)
)
return urls
def selectlist_view(self):
return render_to_response(...)
Run Code Online (Sandbox Code Playgroud)
要返回的视图与 非常相似ModelAdmin.changelist_view()。最好的、DRY 的方法是什么?
我正在尝试使用SplitDateTimeWidget,但希望它以日 - 月 - 年格式接受日期.
from django.forms.widgets import SplitDateTimeWidget
class EventForm(forms.ModelForm):
class Meta:
model = Event
widgets = {'start': SplitDateTimeWidget(date_format='%d/%m/%Y')}
Run Code Online (Sandbox Code Playgroud)
SplitDateTimeWidget接受一个date_format参数,我希望该参数用于验证日期输入,但事实并非如此.
默认窗口小部件已正确替换,但它忽略了date_format,并坚持要对默认的月 - 日 - 年进行验证.
我也试过没有运气设置DATE_FORMAT和DATE_INPUT_FORMATS设置.
谢谢你的帮助.
django ×7
django-forms ×3
django-admin ×2
django-orm ×2
python ×2
ajax ×1
annotations ×1
cleaned-data ×1
custom-view ×1
geos ×1
gis ×1
group-by ×1
polygon ×1