我正在开发一个非常大的项目,每个视图都可以通过正常请求和ajax请求通过相同的URL访问.我正在寻找有关如何创建一个小框架以便以非常通用的方式处理它的想法.根据是否通过ajax调用视图,它需要呈现不同的模板并返回json而不是HttpResponse对象.我想收集关于这个主题的任何想法 - 主要目标应该是避免干燥的原则并使代码尽可能重用.我已经考虑了不同的选项作为通用视图,视图装饰器等,但我对任何事情持开放态度.所以,请让我听听您的建议或指向我所知道的任何现成的片段!
我有两个出版物和员工模型:
class Publication(models.Model):
BOOK_CHAPTER = 1
ARTICLE = 2
PUBLICATION_CHOICES = (
(BOOK_CHAPTER, 'Book chapter'),
(ARTICLE, 'Article'),
)
publication_type = models.IntegerField(choices=PUBLICATION_CHOICES)
article_title = models.CharField(max_length=250, help_text='Limited to 250 characters. May also be used for book chapter titles.')
slug = models.SlugField(help_text='Suggested value automatically generated from title.')
primary_author = models.ForeignKey('Employee', limit_choices_to={'employee_type': 1}, help_text='Most of the time, this will be the faculty member to whom the publication is tied.')
authors = models.CharField(max_length=250, help_text='Limited to 250 characters. Please adhere to accepted format for style. Include …Run Code Online (Sandbox Code Playgroud) 使用通用FormView我想反映一些关于提交给用户的POST数据,但我不确定如何最好地执行此操作.
class MyView(generic.FormView):
form_class = MyForm
def get_success_url(self):
return reverse('success')
Run Code Online (Sandbox Code Playgroud)
reverse('success') 重定向到一个简单的
class SuccessView(generic.TemplateView):
template_name = 'success.html'
Run Code Online (Sandbox Code Playgroud)
有没有办法可以通过调用访问params对象,或者有更好(更简单)的方法吗?TIA DanSuccessViewget_success_url
更新(我的解决方案,但感谢您的想法)
我实际上发现这是解决问题的最简单方法(对我来说):
class SuccessMixin(object):
def post(self, request, *args, **kwargs):
form_class = self.get_form_class()
form = self.get_form(form_class)
if form.is_valid():
return self.form_valid(form)
else:
return self.form_invalid(form, **kwargs)
def form_valid(self, form):
# this is my post processing step which returns the
# feedback data that I want to pass to the user
form_data = form.get_some_data_from_form()
return render_to_response('submitted.html',
{'form_data': form_data,},
context_instance=RequestContext(self.request))
Run Code Online (Sandbox Code Playgroud)
每个视图都继承了这个mixin,如果表单有效,那么我从中提取反馈数据并将其作为响应呈现 - …
我使用通用视图来更新对象.
我使用的形式:
class VehiPrepaClientForm(ModelForm):
class Meta:
model = VehiPrepa
fields = ('date_dem_prepa','carburant','ty_carburant')
def clean(self):
cleaned_data = self.cleaned_data
data = self.cleaned_data['date_dem_prepa']
vehiprepa = get_object_or_404(VehiPrepa,pk=object_id)
if data :
vehiprepa.demande_prepa = 1
vehiprepa.save()
date_in = vehiprepa.date_in
delta = data - date_in
date_dem = date_in + delta
if delta.days < 2 :
raise forms.ValidationError("Veuillez entrez une date au dela du : %s" %(date_dem) )
if data.weekday()>= 5 :
raise forms.ValidationError("La date choisie n'est pas valide, cela tombe un weekend")
#test si date demande sup …Run Code Online (Sandbox Code Playgroud) 我正在尝试将基于角色的权限实现到我的应用程序中.我有一个decorator role_required,我可以传递一组用户角色,只有具有该角色的用户才能访问该视图.我已经为用户正确分配了角色,但现在我收到了AttributeError声明'Role' object has no attribute '__name__'
views.py 文件:
m_role_required = method_decorator(role_required)
class AddProposal(FormView):
@m_role_required(roles.space_admin)
def dispatch(self, *args, **kwargs):
return super(AddProposal, self).dispatch(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)
装饰者role_required:
from django.contrib.auth.decorators import user_passes_test
def role_required(*roles):
def check_role(user):
return getattr(user, 'role', None) in roles
return user_passes_test(check_role)
Run Code Online (Sandbox Code Playgroud)
本Role类:
class Roles(object):
_roles_dict = None
@property
def roles_dict(self):
if self._roles_dict is None:
self._roles_dict = {}
for item in self._config:
if isinstance(item, basestring):
# An item like 'manager'
self._roles_dict[item] = None
else:
# Anything else …Run Code Online (Sandbox Code Playgroud) 我有一个模型,有一个作者ForeignKey,如下:
class Appointment(models.Model):
# ...
author = models.ForeignKey(User)
Run Code Online (Sandbox Code Playgroud)
我希望在author为当前登录用户创建约会时自动设置该字段.换句话说,作者字段不应出现在我的Form类中:
class AppointmentCreateForm(ModelForm):
class Meta:
model = Appointment
exclude = ('author')
Run Code Online (Sandbox Code Playgroud)
有两个问题:
author?我有一个自定义FormView类的mixin,如果保存成功,只需添加成功消息,所以:
class MessagesMixin(object):
def form_valid(self, form):
response = super(MessagesMixin, self).form_valid(form)
messages.add_message(self.request,
messages.SUCCESS,
'Successfully created %s' % form.instance)
return response
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,这只能真正涵盖创作.如果实例更新,则消息仍将显示"已创建".有没有办法区分form_valid方法中的创建/更新?
我有一个ListView分页:
class StoriesListView(ListView):
model = Story
paginate_by = 20
def get_queryset(self):
return Story.objects.all().order_by('-updated_at')
Run Code Online (Sandbox Code Playgroud)
我Story在数据库中有1000个对象.当用户加载我的视图时会发生什么?是从数据库查询所有1000还是只查询20?我该如何优化呢?
我尝试了通用视图的简约django实现来上传个人资料图片.
views.py
class UpdateProfile(UpdateView):
form_class = UpdateUserProfileForm
model = UserProfile
success_url = reverse_lazy('show_profile')
Run Code Online (Sandbox Code Playgroud)
models.py
class UserProfile(models.Model):
user = models.OneToOneField(User)
website = models.URLField(blank=True)
picture = models.ImageField(upload_to='user/img/%Y-%m-%d/', blank=True)
Run Code Online (Sandbox Code Playgroud)
forms.py
class UpdateUserProfileForm(forms.ModelForm):
class Meta:
model = UserProfile
fields = ['website','picture']
Run Code Online (Sandbox Code Playgroud)
userprofile_form.html
<form action="" enctype="multipart/form-data" method="post">{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="{% trans "Save" %}"/>
</form>
Run Code Online (Sandbox Code Playgroud)
一切正常.现在错误消息.网站字段将正确更新,搜索按钮允许选择要上传的文件.但是,该文件永远不会出现在系统中,并且数据库字段仍为空.
不幸的是,关于文件上传的django文档(https://docs.djangoproject.com/en/1.10/topics/http/file-uploads/)不包含通用视图,所以我想知道它是否可行.
更新:感谢Alasdair的回答,我更新了我的模板,因此它现在可以正常用作带有通用视图的图片上传的简约原型.
要显示图片,文档(https://docs.djangoproject.com/en/1.10/howto/static-files/)的说明再次非常有用.
此外,媒体设置是将文件上载到媒体文件夹所必需的.
settings.py
MEDIA_URL = '/media/'
MEDIA_ROOT = 'absolute-path-to/media'
Run Code Online (Sandbox Code Playgroud)
urls.py
from django.conf import settings
from django.conf.urls.static import static …Run Code Online (Sandbox Code Playgroud) django ×10
django-views ×2
python ×2
ajax ×1
database ×1
decorator ×1
django-forms ×1
file-upload ×1