标签: django-generic-views

使用基于类的通用视图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-haystack通用SearchView - 没有结果

根据这里的文档,我试着让haystack使用基于类的通用视图.我可以从shell中的SearchQuerySet获得结果,因此模型正在编制索引.但我无法让视图在页面上返回结果.

使用通用视图的主要原因是我希望稍后使用更多SQS逻辑进行扩展.

我可能错过了一些明显的东西......

views.py:

from haystack.query import SearchQuerySet
from haystack.generic_views import SearchView

from .forms import ProviderSearchForm
from .models import Provider

class ProviderSearchView(SearchView):
    template_name = 'search/provider_search.html'
    form_class    = ProviderSearchForm

    def get_context_data(self, *args, **kwargs):
        """ Extends context to include data for services."""
        context = super(ProviderSearchView, self).get_context_data(*args, **kwargs)
        context['body_attr']        = 'id="provider-search"'
        return context

    def get_queryset(self):
        queryset = super(ProviderSearchView, self).get_queryset()
        return queryset.filter(is_active=True)
Run Code Online (Sandbox Code Playgroud)

search_indexes.py:

from haystack import indexes
from .models import Provider

class ProviderIndex(indexes.SearchIndex, indexes.Indexable):
    text        = indexes.CharField(document=True, use_template=True)
    title       = indexes.CharField(model_attr='name')
    created …
Run Code Online (Sandbox Code Playgroud)

python django django-generic-views django-haystack

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

在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类的通用视图中访问上下文对象

我正在使用DetailView来查看Project对象,我希望能够访问正在查看的Project对象,以便将其传递给装饰器,如下所示:

class ProjectDetailView(DetailView):
    context_object_name = "project"
    model = Project

    @method_decorator(membership_required(project))
    def dispatch(self, *args, **kwargs):
        return super(ProjectDetailView, self).dispatch(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)

但是,将"project"或"object"传递给装饰器会给我一个"对象",而不是Project实例.如何获取Project实例,以便我的装饰器功能可以使用它?

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

5
推荐指数
1
解决办法
9066
查看次数

从基于类的通用视图手动获取响应

我正在尝试编写一个测试来验证从基于类的通用视图返回的HTML.假设我有这个基于函数的视图,只需渲染一个模板:

# views.py
from django.shortcuts import render

def simple_view(request, template='template.html'):
    return render(request, template)
Run Code Online (Sandbox Code Playgroud)

有了它,在测试期间我可以这样做:

# tests.py
from django.http import HttpRequest
from .views import simple_view

request = HttpRequest()
response = simple_view(request)
Run Code Online (Sandbox Code Playgroud)

然后对其进行验证response.现在我想将上面的内容转换为继承自TemplateView的基于类的视图:

# views.py
from django.views.generic import TemplateView

class SimpleView(TemplateView):
    template_name = 'template.html'
Run Code Online (Sandbox Code Playgroud)

现在基本相同的测试方法失败了:

# tests.py
from django.http import HttpRequest
from .views import SimpleView

request = HttpRequest()
view_func = SimpleView.as_view()
response = view_func(request).render()
Run Code Online (Sandbox Code Playgroud)

结果是

Traceback (most recent call last):
    File "tests.py", line 30, in test_home_page_returns_correct_html
response = view_func(request).render()
    File …
Run Code Online (Sandbox Code Playgroud)

python django django-generic-views django-class-based-views

5
推荐指数
1
解决办法
2075
查看次数

django:DetailView:self.object从方法post调用时引发错误,但是从get_context_data方法调用时它确实起作用

我创建了一个继承自的类DetailView,并且覆盖了方法get_context_datapost。标题中提到的内容看起来很怪异,因为我可以发邮件给我self.objectget_context_data但不能发邮件,所以我不得不self.get_object()改用。但是我想了解为什么?被self.object删除get_context_data?这样在它之后调用的任何方法都不能使用它或类似的东西吗?

提前致谢

django django-generic-views detailview

5
推荐指数
1
解决办法
1227
查看次数

在 Django 1.6 中结合 DetailView 和 CreateView

我有 2 个独立的模型,发布和评论。我使用 DetailView 来显示 Post 内容,我想使用 CreateView 在同一页面上显示评论创建表单。最干净的方法是什么?

唯一想到的是使用自定义视图,它既获取对象又处理评论表单,但这看起来太脏了:

def post_detail(request, slug):
    post = get_object_or_404(Post, slug=slug)
    if request.POST:
        form = CommentForm(request.POST)
        # do comment form processing here
    return render(request, "post/post_detail.html", {
        "object": post, "comment_form": form})
Run Code Online (Sandbox Code Playgroud)

使用基于类的视图有什么干净的方法可以做到这一点吗?或者只是将帖子显示代码与评论处理代码分离的某种方法?

python django django-generic-views django-class-based-views

5
推荐指数
1
解决办法
2442
查看次数

带有更新的 slug 的 Django 通用视图 UpdateView 重定向 URL

这是我的更新视图,它由带有 slug 字段的 URL 调用,例如

/mymodel/update/<model_name_slug>/
Run Code Online (Sandbox Code Playgroud)

MyModel有两个字段,nameslug。slug 字段<model_name_slug>是从 自动生成的MyModel.name。如果用户更新它,将自动生成一个新的 slug 字段。然后,我想使用新生成的 slug 字段重定向到这个新 URL。

段塞场自动生成正在工作。它在MyModelEditForm. 但是,下面的代码不起作用。原因是:

1) 用户输入此 URL 以更新现有模型

/mymodel/update/example-model
Run Code Online (Sandbox Code Playgroud)

2) 用户将 Name 属性更改为"example model changed"。然后蛞蝓字段将作为生成"example-model-changed"MyModel

3) 但是 URL 没有重定向到"/mymodel/update/example-model-changed",因为get_object()将返回None. get()将无法将新生成的 URL"example-model-changed"与原始URL 进行比较"example-model"

我在下面的代码中缺少什么?我尝试使用 访问新的更新对象self.object,但出现以下错误:

 MyModelUpdateView object has no attribute 'object'
Run Code Online (Sandbox Code Playgroud)

这是代码片段:

class MyModelUpdateView(LoginRequiredMixin, UpdateView):
    model = MyModel
    form_class = MyModelUpdateForm …
Run Code Online (Sandbox Code Playgroud)

django django-forms django-views django-generic-views

5
推荐指数
2
解决办法
6853
查看次数

将URL变量传递给基于类的视图

我刚刚开始搞乱基于类的视图,我希望能够从我的类中的URL访问变量.但是我很难让这个工作.我看到了一些答案,但它们都很短暂,我发现它们没有任何帮助.

基本上我有一个网址

url(r'^(?P<journal_id>[0-9]+)/$',
    views.Journal_Article_List.as_view(), 
    name='Journal_Page'),
Run Code Online (Sandbox Code Playgroud)

然后我想ListView用来显示特定期刊中的所有文章.然而,我的文章表通过a链接到日志表journal_id.所以我最终做了以下事情

class Journal_Article_List(ListView):
    template_name = "journal_article_list.html"
    model = Articles
    queryset = Articles.objects.filter(JOURNAL_ID = journal_id)
    paginate_by = 12

    def get_context_data(self, **kwargs):
        context = super(Journal_Article_List, self).get_context_data(**kwargs)
        context['range'] = range(context["paginator"].num_pages)
        return context
Run Code Online (Sandbox Code Playgroud)

但是,journal_id不像函数视图那样传递.从我在上面阅读的主题中可以找到我可以使用的变量访问变量

self.kwargs['journal_id']
Run Code Online (Sandbox Code Playgroud)

但我有点迷失在我应该如何做到这一点上.我已经在类中直接尝试了它,它让我知道self不存在或者通过覆盖get_queryset,在这种情况下它告诉我as_view()只接受已经是类的属性的参数.

django url listview class django-generic-views

5
推荐指数
1
解决办法
3978
查看次数

无法通过 django CreateView 和 ModelForm 使用 DateTime 输入

我尝试使用 CreateView 通过 UI 创建模型事件的对象 我的模型是

class Event(models.Model):
    start = models.DateTimeField(_("start"), db_index=True)
    end = models.DateTimeField(_("end"), db_index=True, help_text=_("The end time must be later than the start time."))
    title = models.CharField(_("title"), max_length=255)
    description = models.TextField(_("description"), blank=True)
    rule = models.ForeignKey(Rule)
    calendar = models.ForeignKey(Calendar)
Run Code Online (Sandbox Code Playgroud)

我的模型表单是

class EventForm(forms.ModelForm):
    class Meta:
        model=Event
        fields=['start','end','title','description','rule','calendar',]
Run Code Online (Sandbox Code Playgroud)

我的网址是

url(r'^addEvent/$', CreateEventView.as_view(), name='add-event'),
Run Code Online (Sandbox Code Playgroud)

查看是

class CreateEventView(CreateView):
    form_class=EventForm
    template_name="createEventForm.html"
    success_url='/eventListView/'
Run Code Online (Sandbox Code Playgroud)

我尝试在以下 HTML 模板中自动呈现此内容

{% extends "base.html" %}
{% load i18n %}
{% block body %}
    <form method='POST'>{% csrf_token %}
        {{form.as_p}}
    <button type="submit">Save</button>
    </form> …
Run Code Online (Sandbox Code Playgroud)

django-templates django-forms django-generic-views jquery-widgets bootstrap-datetimepicker

5
推荐指数
0
解决办法
853
查看次数