- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在整合一个项目,并尝试尽可能多地利用开源库,以尽量减少完成工作所涉及的“输入”。我正在使用 django、crispy-forms 和 bootstrap 框架。
我已经编写了用于处理一个实体(添加/编辑/删除)的代码,并且感觉我一定是做错了什么,因为似乎涉及的代码太多 - 有 20 多个不同的项目需要管理以同样的方式,所以我想在我开始完成其余代码之前,我会向社区询问我可以修复的错误。
所以我有一个模型:
class Link(models.Model):
name = models.CharField(max_length=255, blank=False, null=False, verbose_name=_(u'Название'))
url = models.URLField(blank=False, null=False, verbose_name=_(u'Ссылка'))
project = models.ForeignKey('Project')
display_on_main_project_page = models.BooleanField(default=False, verbose_name=_(u'Показывать ссылку на главной странице проекта'))
class Meta:
app_label = 'core'
verbose_name = _(u'Ссылка')
verbose_name_plural = _(u'Ссылки')
def __unicode__(self):
return self.name
以及根据手册添加了脆片的表格:
class ProjectLinkForm(forms.Form):
id = forms.IntegerField(required=False, widget=forms.HiddenInput())
project = forms.ModelChoiceField(queryset=Project.objects.all(),required=True, widget=forms.HiddenInput())
name = forms.CharField(required=True, label=_(u'Имя ссылки'))
url = forms.URLField(required=True, label=_(u'URL ссылки'))
display_on_main_project_page = forms.BooleanField(label=_(u'Показывать на главной странице проекта'), required=False)
class Meta:
model = Link
fields = ('project','name','url','display_on_main_project_page')
def __init__(self, *args, **kwargs):
self.helper = FormHelper()
self.helper.form_class = 'horizontal-form'
self.helper.form_action = ''
self.helper.form_id = 'link_form'
self.helper.layout = Layout(
Field('name',css_class='input-block-level'),
Field('url', css_class='input-block-level')
)
super(ProjectLinkForm, self).__init__(*args, **kwargs)
和配置用于执行操作的 url:
url(r'^forms/link/add/(?P<project_id>\d+)/$','core.views.forms.link.add'),
url(r'^forms/link/edit/(?P<link_id>\d+)/$','core.views.forms.link.edit'),
url(r'^forms/link/delete/(?P<link_id>\d+)/$','core.views.forms.link.delete'),
和 View (以add为例):
@login_required
def add(request, project_id):
if request.method == 'GET':
form = ProjectLinkForm(initial={'project':project_id})
form.action = 'add'
form.submit_url = request.path
return render_to_response('core/forms/project_link.html',{'form':form,'links_form_title':_(u'Добавить ссылку')},context_instance=RequestContext(request))
elif request.method == 'POST':
form = ProjectLinkForm(request.POST)
form.action = 'add'
form.submit_url = request.path
if form.is_valid():
try:
new_link = Link()
new_link.name = form.cleaned_data['name']
new_link.url = form.cleaned_data['url']
new_link.project = form.cleaned_data['project']
new_link.display_on_main_project_page = form.cleaned_data['display_on_main_project_page']
new_link.save()
return HttpResponse(status=http_statuses.SAVED, content="saved")
except Exception as e:
return HttpResponse(status=http_statuses.SERVER_ERROR, content=e.message)
else:
return render_to_response('core/forms/project_link.html',{'form':form,'links_form_title':_(u'Добавить ссылку')},context_instance=RequestContext(request))
#not POST or GET
else:
return HttpResponse(status=http_statuses.METHOD_NOT_ALLOWED,content=_(u'Недопустимый тип запроса'))
所有操作都使用一个模板:
{% load crispy_forms_tags %}
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
<h3>{{ links_form_title|default:"Ссылки на проект" }}</h3>
</div>
<div class="modal-body">
<p>
{% if form.action == "delete" %}
Уверены, что хотите удалить ссылку "{{ form.name.value }}"? Одно неосторожное движенье мышкой и все - не вернешь!
<div class="hide">
{% crispy form %}
</div>
{% else %}
{% crispy form %}
{% endif %}
</p>
</div>
<div class="modal-footer">
{% if form.action == "delete" %}
<a href="#" class="btn btn-danger" id="" onclick='SubmitModalForm($("#link_form"),"{{ form.submit_url }}")'>Удалить</a>
{% else %}
<a href="#" class="btn btn-primary" id="" onclick='SubmitModalForm($("#link_form"),"{{ form.submit_url }}")'>Сохранить</a>
{% endif %}
</div>
还有一些 JavaScript 代码来处理所有带有表单的弹出窗口:
function LoadModalForm(url){
$("#dynamic_project_forms").html("").load(url).modal();
}
function SubmitModalForm(the_form,submit_url){
$.ajax({
type:'POST',
url:submit_url,
data: $(the_form).serialize(),
complete: function(e, xhr, settings){
if(e.status == 201){//HTTP.STATUS.SAVED
$("#dynamic_project_forms").modal('hide');
$(activeTab.hash).load('/api/get_project_tab/'+activeTab.hash.replace('#','')+'/{{ project.id }}/');
}
else{
$("#dynamic_project_forms").html(e.responseText);
alert('loaded fucking response');
}
}
});
}
它确实有效,但输入太多 - 我想我遗漏了一些东西或者只是没有得到正确的东西 - 请建议正确的方法。
最佳答案
您可以轻松摆脱一半的代码。
您错过了 modelforms和 generic views .
你可以有这样的网址:
from django.views import generic
urlpatterns = patterns('test_app.views',
url(r'link/create/$', generic.CreateView.as_view(model=Link),
name='link_create'),
url(r'link/(?P<pk>\d+)/update/$', generic.UpdateView.as_view(model=Link),
name='link_update'),
url(r'link/(?P<pk>\d+)/delete/$', generic.DeleteView.as_view(model=Link),
name='link_delete'),
# bonus:
url(r'link/$', generic.ListView.as_view(model=Link), name='link_list'),
url(r'link/(?P<pk>\d+)/$', generic.DetailView.as_view(model=Link),
name='link_detail'),
)
但它默认情况下不支持像您一样的 AJAX - 但是您可以扩展 CreateView
UpdateView
和 DeleteView
并执行所需的小覆盖支持你的javascript。例如,我在一个项目中有这个:
class AjaxDeleteView(generic.DeleteView):
# now that I think of it, this could just be a DetailView ... oh well
http_method_names = ['post']
def post(self, *args, **kwargs):
self.get_object().delete()
return http.HttpResponse('', status=204)
class AjaxFormMixin(object):
def form_valid(self, form):
if form.instance.pk:
status = 204
else:
status = 201
self.object = form.save()
return http.HttpResponse(self.object.pk, status=status)
扩展 Django 通用 View 的一些其他示例:
class PkUrlKwarg(SingleObjectMixin):
"""
Take the pk from request.GET and sets it to kwargs, useful to avoid
reversing urls from javascript
"""
def get_object(self, queryset=None):
self.kwargs[self.pk_url_kwarg] = self.request.REQUEST['pk']
return super(PkUrlKwarg, self).get_object(queryset)
class WidgetFormMixin(object):
def get_form(self, form_class):
# [snip] ok there's quite a lot (11 SLOCs) going on here in my case, since Widget* views are
# supposed to deal with any subclass of Widget
return self.object.configuration_form_instance(self.request)
def get_template_names(self):
widget_name = self.object.__class__.__name__
return [
'form_designer/widget_forms/%s.html' % widget_name,
'form_designer/widget_form.html',
]
class WidgetSecurity(object):
"""
Return a queryset of Widget that have a tab in a form which author is
request.user. For security.
"""
def get_queryset(self):
return Widget.objects.filter(tab__form__author=self.request.user)
最后,我的 CRUD View 有很多非默认的和或多或少复杂的逻辑,但仍然只有很少的代码行:
class WidgetCreateView(WidgetFormMixin, AjaxFormMixin, generic.CreateView):
form_class = WidgetForm # overridden by WidgetFormMixin.get_form, but make django happy
class WidgetUpdateView(PkUrlKwarg, WidgetSecurity, WidgetFormMixin, AjaxFormMixin, generic.UpdateView):
form_class = WidgetForm # overridden by WidgetFormMixin.get_form
class WidgetDeleteView(PkUrlKwarg, WidgetSecurity, AjaxDeleteView):
pass
这可能不是最好的答案,但它应该明确地让你走上正轨,并激励你。
另请注意,您还应该定义 get_absolute_url()在你的模型中。
作为记录,网址:
url(r'widget/create/$',
login_required(WidgetCreateView.as_view()),
name='form_designer_widget_create'),
# the following views accept 'pk' as URL/GET argument
# this avoids reversing urls from javascript at the cost of a 4-liner mixin
url(r'widget/update/$',
login_required(WidgetUpdateView.as_view()),
name='form_designer_widget_update'),
url(r'widget/delete/$',
login_required(WidgetDeleteView.as_view()),
name='form_designer_widget_delete'),
关于Django 处理表单的方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13502594/
我一直在阅读有关汇编函数的内容,但对于是使用进入和退出还是仅使用调用/返回指令来快速执行,我感到很困惑。一种方式快而另一种方式更小吗?例如,在不内联函数的情况下,在汇编中执行此操作的最快(stdcal
我正在处理一个元组列表,如下所示: res = [('stori', 'JJ'), ('man', 'NN'), ('unnatur', 'JJ'), ('feel', 'NN'), ('pig',
最近我一直在做很多网络或 IO 绑定(bind)操作,使用线程有助于加快代码速度。我注意到我一直在一遍又一遍地编写这样的代码: threads = [] for machine, user, data
假设我有一个名为 user_stats 的资源,其中包含用户拥有的帖子、评论、喜欢和关注者的数量。是否有一种 RESTful 方式只询问该统计数据的一部分(即,对于 user_stats/3,请告诉我
我有一个简单的 api,它的工作原理是这样的: 用户创建一个请求 ( POST /requests ) 另一个用户检索所有请求 ( GET /requests ) 然后向请求添加报价 ( POST /
考虑以下 CDK Python 中的示例(对于这个问题,不需要 AWS 知识,这应该对基本上任何构建器模式都有效,我只是在这个示例中使用 CDK,因为我使用这个库遇到了这个问题。): from aws
Scala 中管理对象池的首选方法是什么? 我需要单线程创建和删除大规模对象(不需要同步)。在 C++ 中,我使用了静态对象数组。 在 Scala 中处理它的惯用和有效方法是什么? 最佳答案 我会把它
我有一个带有一些内置方法的类。这是该类的抽象示例: class Foo: def __init__(self): self.a = 0 self.b = 0
返回和检查方法执行的 Pythonic 方式 我目前在 python 代码中使用 golang 编码风格,决定移动 pythonic 方式 例子: import sys from typing imp
我正在开发一个 RESTful API。其中一个 URL 允许调用者通过 id 请求特定人员的记录。 返回该 id 不存在的记录的常规值是什么?服务器是否应该发回一个空对象或者一个 404,或者其他什
我正在使用 pathlib.Path() 检查文件是否存在,并使用 rasterio 将其作为图像打开. filename = pathlib.Path("./my_file-name.tif") 但
我正在寻找一种 Pythonic 方式来从列表和字典创建嵌套字典。以下两个语句产生相同的结果: a = [3, 4] b = {'a': 1, 'b': 2} c = dict(zip(b, a))
我有一个正在操裁剪理设备的脚本。设备有时会发生物理故障,当它发生时,我想重置设备并继续执行脚本。我有这个: while True: do_device_control() device
做组合别名的最pythonic和正确的方法是什么? 这是一个假设的场景: class House: def cleanup(self, arg1, arg2, kwarg1=False):
我正在开发一个小型客户端服务器程序来收集订单。我想以“REST(ful)方式”来做到这一点。 我想做的是: 收集所有订单行(产品和数量)并将完整订单发送到服务器 目前我看到有两种选择: 将每个订单行发
我知道在 Groovy 中您可以使用字符串调用类/对象上的方法。例如: Foo."get"(1) /* or */ String meth = "get" Foo."$meth"(1) 有没有办法
在 ECMAScript6 中,您可以使用扩展运算符来解构这样的对象 const {a, ...rest} = obj; 它将 obj 浅拷贝到 rest,不带属性 a。 有没有一种干净的方法可以在
我有几个函数返回数字或None。我希望我的包装函数返回第一个不是 None 的结果。除了下面的方法之外,还有其他方法吗? def func1(): return None def func2(
假设我想设计一个 REST api 来讨论歌曲、专辑和艺术家(实际上我就是这样做的,就像我之前的 1312414 个人一样)。 歌曲资源始终与其所属专辑相关联。相反,专辑资源与其包含的所有歌曲相关联。
这是我认为必须经常出现的问题,但我一直无法找到一个好的解决方案。假设我有一个函数,它可以作为参数传递一个开放资源(如文件或数据库连接对象),或者需要自己创建一个。如果函数需要自己打开文件,最佳实践通常
我是一名优秀的程序员,十分优秀!