像Django中关于通用视图的大量文档一样,我找不到明确描述如何使用Django Forms的新的基于类的通用视图的文档.
怎么做?
django django-forms django-views django-generic-views django-class-based-views
在我的页面上,我需要显示帖子详细信息和评论表单以供查看者发表评论.我创建了2个通用视图:
# views.py
class PostDetailView (DetailView):
model = Post
context_object_name = 'post'
template_name = 'post.html'
def get_context_data(self, **kwargs):
context = super(PostDetailView, self).get_context_data(**kwargs)
context['comment_form'] = CommentForm()
return context
class AddCommentView(FormView):
template_name = 'post.html'
form_class = CommentForm
success_url = '/'
def form_valid(self, form):
form.save()
return super(AddCommentView, self).form_valid(form)
def form_invalid(self, form):
return self.render_to_response(self.get_context_data(form=form))
detail = PostDetailView.as_view()
add_comment = AddCommentView.as_view()
# urls.py
....
url(r'^(?P<pk>\d+)/$', view='detail'),
url(r'^(?P<post_id>\d+)/add_comment/$', view='add_comment'),
....
Run Code Online (Sandbox Code Playgroud)
AddCommentView会出现错误,因为我没有为评论指定帖子的ID.如何在AddCommentView中访问post_id?
假设我们有一个名为Closet的应用程序,它有一些模型:
# closet.models.py
class Outfit(models.Model):
shirt = models.ForeignKey(Shirt)
pants = models.ForeignKey(Trouser)
class Shirt(models.Model):
desc = models.TextField()
class Trouser(models.Model):
desc = models.TextField()
class Footwear(models.Model):
desc = models.TextField
Run Code Online (Sandbox Code Playgroud)
使用通用详细信息视图,可以轻松地将URL配置为以下每个的详细信息:
#urls.py
urlpatterns = patterns('',
url(r'^closet/outfit/(?P<pk>\d+)$', DetailView(model=Outfit), name='outfit_detail'),
url(r'^closet/shirt/(?P<pk>\d+)$', DetailView(model=Shirt), name='shirt_detail'),
url(r'^closet/trouser/(?P<pk>\d+)$', DetailView(model=Trouser), name='trouser_detail'),
url(r'^closet/footwear/(?P<pk>\d+)$', DetailView(model=Footwear), name='footwear_detail'),
)
Run Code Online (Sandbox Code Playgroud)
我接下来要做的是定义将创建每种类型的新对象的视图.我想这样做的扩展版本CreateView将能够处理预先填充的字段上的数据.
具体来说,我想要以下行为:
/closet/outfit/new我希望得到一个标准ModelForm的Outfit一切空白,一切编辑模式./closet/outfit/new/?shirt=1我想看到我在案例1)中看到的所有字段,但我希望衬衫字段预先填充pk = 1的衬衫.此外,我希望衬衫字段显示为不可编辑.如果表单已提交且被视为无效,则在重新显示表单时,我希望衬衫字段继续不可编辑./closet/outfit/new/?shirt=1&trouser=2我想看到我在案例1)中看到的所有领域,但现在衬衫和裤子领域都应该是预先设定的并且是不可编辑的.(即只有footwear字段应该是可编辑的.)一般来说,这可能吗?即,查询字符串可以这种方式修改显示的表单的结构吗?我希望尽可能以DRYest方式实现这一目标.我的直觉告诉我这应该是基于类的观点可行,也许会涉及model_form_factory但我无法在我的脑海中找到逻辑.特别是,我不确定是否有可能让基于类的视图在构造时访问request.REQUEST(即request.POST或request.GET参数)ModelForm.
也许只有当我为锁定的字段使用不同的查询字符串关键字时才可能.也许URL需要是:/closet/outfit/new/?lock_shirt=1和/closet/outfit/new?lock_shirt=1&lock_trouser=2 …
django django-forms django-generic-views django-class-based-views
令人印象深刻的是,功能性网站与教程中的通用视图一起快速发展.此外,表单处理的工作流程很好.我使用ModelForm帮助器类从我制作的模型创建一个表单,并很高兴看到这么多的功能汇集在一起.当我使用通用list_detail.object_detail时,我很失望,我可以显示的所有内容都是单独的字段.我知道ModelForm类包含用于呈现的信息,因此我想将ModelForm与通用视图一起使用.
我正在询问stackoverflow以获得一些方向,并欣赏几张海报的答案和评论.我已经想出如何让它工作,但DetailView中有一个错误.该解决方案包括一种解决方法.
要将ModelView与通用视图一起使用,并使所有字段自动呈现以下工作:
创建一个项目,并在其中创建应用程序住院患者.
如果你有
# inpatients/models.py
class Inpatient(models.Model):
last_name = models.CharField(max_length=30)
first_name = models.CharField(max_length=30,blank=True)
address = models.CharField(max_length=50,blank=True)
city = models.CharField(max_length=60,blank=True)
state = models.CharField(max_length=30,blank=True)
DOB = models.DateField(blank=True,null=True)
notes = models.TextField(blank=True)
def __unicode__(self):
return u'%s, %s %s' % (self.last_name, self.first_name, self.DOB)
class InpatientForm(ModelForm):
class Meta:
model = Inpatient
Run Code Online (Sandbox Code Playgroud)
和
# inpatients/views.py
from django.http import HttpResponse, HttpResponseRedirect
from django.shortcuts import render_to_response
from django.views.generic import DetailView
from portal.inpatients.models import *
def formtest(request):
if request.method == 'POST':
form = InpatientForm(request.POST)
if form.is_valid():
form.save()
return …Run Code Online (Sandbox Code Playgroud) 假设我有一个这样的模型:
class Car(models.Model):
BRANDS = (
('FRD', 'Ford'),
('MCD', 'Mercedes'),
...
)
brand = models.CharField(max_length=3, choices=BRANDS)
color = models.CharField(max_length=24)
url = models.URLField()
new = models.BooleanField(default=False)
Run Code Online (Sandbox Code Playgroud)
并希望使用基于类的通用视图生成列表视图:
在urls.py中
url(r'^car/list/$', CarList.as_view(), name='car_list'),
Run Code Online (Sandbox Code Playgroud)
在views.py中
class CarList(ListView):
model = Car
template_name = "list.html"
def get_queryset(self):
return Car.objects.all()
Run Code Online (Sandbox Code Playgroud)
在list.html中
{% for car in cars %}
<tr>
<td>{{ car.brand }}</td>
<td>{{ car.color }}</td>
<td>{{ car.url }}</td>
<td>{{ car.new }}</td>
</tr>
Run Code Online (Sandbox Code Playgroud)
现在我想提供一些选项来在查询集上添加过滤器(以及每列的排序选项).例如,在任何列上执行%LIKE%的常规搜索框,或从品牌选择中选择的选项或每列的简单asc/desc.
我知道过滤器和排序最终应该在queryset(get_queryset)中,但这需要在模板和视图代码中进行大量的特定工作,而我觉得应该有一些软件包可以帮助解决这个问题?
有人有我的指示吗?
我正在尝试展开提交按钮,使其与密码字段的大小相同。我正在使用代码 btn-block 但它不起作用。
<div class="container">
<div class="row" style="margin-top:60px;">
<div class="col-md-4 col-md-offset-4">
<div class="span12" style="text-align:center; margin: 0 auto;">
<form class="form-horizontal" style="width: 400px; margin: 0 auto;" method="post">
<fieldset>
<h3 style="color:dimgray;" class="sign-up-title">
Bem-vindo de volta! Efetue seu login
</h3>
<hr class="colorgraph">
<legend>
Efetue seu login
</legend>
<div style='display:none'>
<input type='hidden' name='csrfmiddlewaretoken' value='ImQqDNXbmiVQKGo3OsZlrepAzwfAu70B' />
</div>
<tr>
<th>
<label for="id_username">
Usuário:
</label>
</th>
<td>
<input id="id_username" type="text" name="username" maxlength="30" />
</td>
</tr>
<tr>
<th>
<label for="id_password">
Senha:
</label>
</th>
<td>
<input type="password" name="password" id="id_password" /> …Run Code Online (Sandbox Code Playgroud) 我有一个带有通用 UpdateView 的模型“SavedSearch”。每个站点用户可以有一个已保存的搜索。在网站上运行搜索时,我想让他们能够单击“保存此搜索”按钮,该按钮将带他们进入当前 SavedSearch 模型的编辑表单,并将其值替换为搜索中的值(保存在请求.会话.参数)。
因此,我试图捕获模板途中的绑定表单并替换一些值而不保存,以便用户有机会编辑选项或改变主意并取消。
我尝试更新 get_form() 中的实例字段:
def get_form(self, form_class):
form = super(SavedSearchUpdateView, self).get_form(form_class)
# if request is coming from a search form "save" click,
# replace form context data with options from search form.
if self.request.GET.get('ss_override') and self.request.session.get('params', None):
params = self.request.session["params"]
if params.get('location', None): form.instance.location_keywords = params.get('location')
# ... etc.
return form
Run Code Online (Sandbox Code Playgroud)
我还尝试传递request到表单的__init__via get_form_kwargs(),然后在表单的 init 中执行与上面几乎相同的操作。这两种策略都不会导致表单数据发生任何变化。
我还尝试传递request到get_form_kwargs()然后进入__init__:
def __init__(self, *args, **kwargs):
request = …Run Code Online (Sandbox Code Playgroud) 我有一个带有通用外键的简单模型:
class Generic(models.Model):
content_type = models.ForeignKey(ContentType)
object_id = models.PositiveIntegerField()
content_object = GenericForeignKey('content_type', 'object_id')
Run Code Online (Sandbox Code Playgroud)
我想过滤此表中具有非null content_object的所有条目,即过滤掉Generic其内容对象不再存在的所有实例:
Generic.objects.filter(~Q(content_object=None))
Run Code Online (Sandbox Code Playgroud)
这不起作用,给出例外:
django.core.exceptions.FieldError:字段'content_object'不生成自动反向关系,因此不能用于反向查询.如果是GenericForeignKey,请考虑添加GenericRelation.
添加GenericRelation到引用的内容类型模型没有区别.
如何实现这一点的任何帮助将不胜感激,非常感谢.
编辑:我意识到我可以级联删除,但在我的情况下这不是一个选项(我希望保留数据).
python django django-queryset django-generic-views django-contenttypes
我在 django 2 中,在这里面临一些问题。让我先给你我的文件
视图.py
class home_view(ListView):
model = home_blog_model
template_name = "home.html"
context_object_name = "posts"
paginate_by = 6
ordering = ['-date']
def get_context_data(self , **kwargs):
context = super(home_view , self).get_context_data(**kwargs)
context.update({"snippets":snippet_form_model.objects.all()})
return context
Run Code Online (Sandbox Code Playgroud)
模型.py
class snippet_form_model(models.Model):
title = models.CharField(max_length=500)
language = models.CharField(max_length=50)
code = models.TextField()
describe = models.TextField()
class Meta:
ordering = ['-created']
def __str__(self):
return self.title
Run Code Online (Sandbox Code Playgroud)
问题是我想将 {{ snippet_form_model }} 的元素按相反顺序排序,但我没有在该模型中指定要排序的日期。有什么不同的方式来设置顺序吗?
我的目标与这个问题中提出的问题非常相似,但是是从 DRF 的角度来看,而不是从表单的角度来看。
所以基本上问题是,如何在以下代码片段中获取新创建的对象:
TestSerializer(serializers.ModelSerializer)
class Meta:
fields = '__all__'
model = TestModel
class TestView(generics.CreateAPIView):
serializer_class = TestSerializer
def create(self, request, *args, **kwargs):
response = super(TestView, self).create(request, *args, **kwargs)
created_model_instance = .... ?
print(created_model_instance.id)
return response
Run Code Online (Sandbox Code Playgroud) django ×8
django-forms ×3
python ×2
sorting ×2
django-views ×1
filter ×1
listview ×1
modelform ×1