标签: django-generic-views

Django基于类的通用视图和模型形式

像Django中关于通用视图的大量文档一样,我找不到明确描述如何使用Django Forms的新的基于类的通用视图的文档.

怎么做?

django django-forms django-views django-generic-views django-class-based-views

7
推荐指数
1
解决办法
2627
查看次数

Django - 基于类的FormView中的Catch参数

在我的页面上,我需要显示帖子详细信息和评论表单以供查看者发表评论.我创建了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?

python django django-generic-views

7
推荐指数
1
解决办法
6135
查看次数

Django:具有查询字符串指定的预填充和不可编辑字段的CreateView

假设我们有一个名为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将能够处理预先填充的字段上的数据.

具体来说,我想要以下行为:

  1. 如果我访问/closet/outfit/new我希望得到一个标准ModelFormOutfit一切空白,一切编辑模式.
  2. 如果我访问/closet/outfit/new/?shirt=1我想看到我在案例1)中看到的所有字段,但我希望衬衫字段预先填充pk = 1的衬衫.此外,我希望衬衫字段显示为不可编辑.如果表单已提交且被视为无效,则在重新显示表单时,我希望衬衫字段继续不可编辑.
  3. 如果我访问/closet/outfit/new/?shirt=1&trouser=2我想看到我在案例1)中看到的所有领域,但现在衬衫和裤子领域都应该是预先设定的并且是不可编辑的.(即只有footwear字段应该是可编辑的.)

一般来说,这可能吗?即,查询字符串可以这种方式修改显示的表单的结构吗?我希望尽可能以DRYest方式实现这一目标.我的直觉告诉我这应该是基于类的观点可行,也许会涉及model_form_factory但我无法在我的脑海中找到逻辑.特别是,我不确定是否有可能让基于类的视图在构造时访问request.REQUEST(即request.POSTrequest.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

7
推荐指数
1
解决办法
2076
查看次数

使用基于类的通用视图DetailView与ModelForm显示一个错误 - 如何继续?

令人印象深刻的是,功能性网站与教程中的通用视图一起快速发展.此外,表单处理的工作流程很好.我使用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)

django bug-reporting modelform django-generic-views

6
推荐指数
1
解决办法
6784
查看次数

Django:向基于(基于)类的ListView添加过滤(和排序)的最佳方法?

假设我有一个这样的模型:

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)中,但这需要在模板和视图代码中进行大量的特定工作,而我觉得应该有一些软件包可以帮助解决这个问题?

有人有我的指示吗?

sorting django filter django-generic-views

6
推荐指数
1
解决办法
3903
查看次数

Bootstrap btn-block 不起作用

我正在尝试展开提交按钮,使其与密码字段的大小相同。我正在使用代码 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)

django-generic-views twitter-bootstrap-3

6
推荐指数
6
解决办法
1万
查看次数

在 get_form() 期间覆盖 Django ModelForm 实例中的值

我有一个带有通用 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 中执行与上面几乎相同的操作。这两种策略都不会导致表单数据发生任何变化。

我还尝试传递requestget_form_kwargs()然后进入__init__

def __init__(self, *args, **kwargs):
    request = …
Run Code Online (Sandbox Code Playgroud)

django django-forms django-generic-views

6
推荐指数
1
解决办法
2818
查看次数

在Django queryset中过滤不存在​​的GenericForeignKey对象

我有一个带有通用外键的简单模型:

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

6
推荐指数
1
解决办法
1641
查看次数

在 django 的列表视图中排序

我在 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 }} 的元素按相反顺序排序,但我没有在该模型中指定要排序的日期。有什么不同的方式来设置顺序吗?

sorting django listview django-generic-views

6
推荐指数
1
解决办法
5150
查看次数

DRF - 如何在 CreateAPIView 中获取创建的对象

我的目标与这个问题中提出的问题非常相似,但是是从 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-generic-views django-rest-framework

6
推荐指数
1
解决办法
1623
查看次数