天道酬勤,学无止境

在 Django 之外使用模型和表单?(Using Models and Forms outside of Django?)

问题

是否可以在 Django 环境之外使用 Django 模型和表单运行视图文件?

回答1

有可能的。 Django 相当擅长成为没有太多魔法的直接 python,所以你通常可以解耦事物。 视图只是函数,可以从任何其他 Python 代码中调用。

要使用 ORM,您必须在脚本中设置 django 环境。 查看“manage.py”文件显示了如何执行此操作:

from django.core.management import setup_environ
import settings
setup_environ(settings)

现在,您可以调用您想要的任何视图:

from myapp.views import some_view

some_view(...)

请记住,约定是视图函数将 HttpRequest 对象作为它们的第一个参数,并返回一个 HttpResponse 对象。 您可以自己构建一个请求对象:

from django.http import HttpRequest

result = some_view(HttpRequest(), ...)

但是如果您真的对使用 HttpResponse 或 HttpRequest 对象不感兴趣,也许您不应该将您的方法称为“视图”。 也许它们是“实用程序”或其他东西。 这些都不是 Django 强制执行的,但是遵循这样的约定是一种很好的形式,这样其他程序员就可以阅读您的代码。

编辑: 2010-05-24:修复了“setup_environ”(之前错误地使用了“execute_manager”)。 参考。

回答2

在 Django 1.6 中,这可以通过将项目目录放在路径中来完成,然后设置 DJANGO_SETTINGS_MODULE 环境变量,如下所示:

import sys
import os

sys.path.append(path_to_the_project_dir)
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'projectname.settings')

然后,您可以开始导入模型。

回答3

在 Django 1.7 中,您还需要执行以下操作:

import sys
import os

sys.path.append(path_to_the_project_dir)
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'projectname.settings')

import django
django.setup()

否则,您将遇到AppRegistryNotReady异常。

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 如何将Ajax与Django应用程序集成?(How do I integrate Ajax with Django applications?)
    问题 我是Django的新手,而Ajax的新手。 我正在一个需要将两者整合的项目中。 我相信我理解它们背后的原理,但是并没有找到对这两个原理的良好解释。 有人可以给我一个简短的解释,说明如何将两者集成在一起才能更改代码库吗? 例如,我是否仍可以将HttpResponse与Ajax一起使用,或者我的响应是否必须随着Ajax的使用而改变? 如果是这样,您能否提供一个示例,说明如何更改请求的响应? 如果有什么不同,我返回的数据是JSON。 回答1 即使这不完全符合SO精神,但我还是很喜欢这个问题,因为刚开始时我遇到了同样的麻烦,因此,我将为您提供快速指南。 显然,您不了解其背后的原理(不要将其视为冒犯,但如果您这样做,您将不会提出疑问)。 Django是服务器端的。 这就意味着,比如说客户访问一个URL,您在views内部就有一个函数,该函数可以呈现他所看到的内容并以HTML返回响应。 让我们将其分解为示例: views.py: def hello(request): return HttpResponse('Hello World!') def home(request): return render_to_response('index.html', {'variable': 'world'}) index.html: <h1>Hello {{ variable }}
  • Django:在管理表单之外使用ForeignKeyRawIdWidget(Django: using ForeignKeyRawIdWidget outside of admin forms)
    问题 我正在尝试查找一些有关如何以自己的形式使用ForeignKeyRawIdWidget的文档。 目前,我一直收到错误消息,“ init ()至少接受2个非关键字参数(给定1个)”,这告诉我什么都没有。 非常感激任何的帮助。 在Google上进行搜索时,只会发现一些开发人员的对话,而我找不到如何实现它的示例。 更新:这已解决; 请参阅下面的解决方案。 回答1 从Django 1.5开始,这可以以非管理员形式重用ForeignKeyRawIdWidget。 from django.contrib.admin.sites import site class InvoiceForm(ModelForm): class Meta: model = Invoice widgets = { 'customer': ForeignKeyRawIdWidget(Invoice._meta.get_field('customer').rel, site), } 更新 Django 2.0不推荐使用field.rel ,而推荐使用field.remote_field 。 您可能想改用它(也可以在Django 1.11上使用): ... ForeignKeyRawIdWidget(Invoice._meta.get_field('customer').remote_field, site),
  • 更好的ArrayField管理小部件?(Better ArrayField admin widget?)
    问题 有什么方法可以使ArrayField的管理小部件允许添加和删除对象? 似乎默认情况下,它只显示一个文本字段,并使用逗号分隔其值。 除了不方便之外,在数组的基字段是Char / TextField的情况下,AFAICT不允许在数组的任何文本中包含逗号。 回答1 对于OP或其他人,在这些有用的知识之间,您应该很好: 1.扩展SelectMultiple或CheckboxSelectMultiple小部件以解析arrayfield和 2.使用上面的小部件创建或扩展管理表单以显示arrayfield 回答2 我对此并不表示赞赏(原始资源),但是如果您使用PostgreSQL作为数据库并且乐于使用特定于Postgres的ArrayField实现,那么还有一个更简单的选择:在模型上对ArrayField进行子类ArrayField并覆盖默认的管理小部件。 基本实现如下(在Django 1.9、1.10、1.11、2.0、2.1和2.2中进行了测试): models.py from django import forms from django.db import models from django.contrib.postgres.fields import ArrayField class ChoiceArrayField(ArrayField): """ A field that
  • 具有 500,000 个对象的 ManyToMany 字段的 Django 表单超时(Django form with ManyToMany field with 500,000 objects times out)
    问题 例如,我有一个名为“Client”的模型和一个名为“PhoneNumbers”的模型 class PhoneNumbers(models.Model): number = forms.IntegerField() class Client(models.Model): number = forms.ManyToManyField(PhoneNumbers) 客户端与电话号码之间存在多对多关系。 PhoneNumbers 中有近 500,000 条记录,因此在使用 M2M 归档附带的 MultiSelect 小部件从模型表单编辑客户记录时,加载需要很长时间。 事实上,它从来没有。 它只是坐在那里试图加载我假设的所有电话对象。 我的解决方法是使用 ajax 和 jquery 处理一些乏味的事情,只编辑客户端记录中的电话号码。 在浪费我的时间之前,我想看看是否有其他方法可以在不让我的页面挂起的情况下进行。 回答1 您需要为此字段创建一个自定义小部件,以便您自动完成正确的记录。 如果你不想推出自己的:http://django-autocomplete-light.readthedocs.io/ 我已经将它用于其通用关系支持,M2M 自动完成看起来也非常简单和直观。 在此处查看使用视频:http://www.youtube.com/watch?v=fJIHiqWKUXI
  • 使用内联表单集创建模型和相关模型(Creating a model and related models with Inline formsets)
    问题 [我已在Django用户上发布了此| Google网上论坛也可以。] 使用内联表单集文档中的示例,我能够编辑属于特定模型的对象(使用modelforms)。 我一直在尝试使用相同的模式来使用内联表单集创建新对象,但是一直无法清除我的头来为此目的提供工作视图。 使用与上面的链接相同的示例,我将如何创建“作者”模型及其相关的“书”对象的新实例? 回答1 首先,创建一个Author模型表单。 author_form = AuthorModelForm() 然后创建一个虚拟作者对象: author = Author() 然后使用伪作者创建内联表单集,如下所示: formset = BookFormSet(instance=author) #since author is empty, this formset will just be empty forms 将其发送到模板。 数据返回到视图后,您可以创建作者: author = AuthorModelForm(request.POST) created_author = author.save() # in practice make sure it's valid first 现在,将内联表单集与新创建的作者挂钩,然后保存: formset = BookFormSet(request.POST, instance=created
  • Django管理界面:将horizo​​ntal_filter与内联ManyToMany字段一起使用(Django admin interface: using horizontal_filter with inline ManyToMany field)
    问题 我有一个要内联的Django模型字段。 该字段是多对多关系。 因此,有“项目”和“用户个人资料”。 每个用户配置文件可以选择任意数量的项目。 目前,我已经可以使用“表格”内联视图。 有没有一种方法可以使用“水平过滤器”,以便我可以轻松地从用户个人资料中添加和删除项目? 请参阅随附的图片作为示例。 这是用户个人资料的模型代码: class UserProfile(models.Model): user = models.OneToOneField(User, unique=True) projects = models.ManyToManyField(Project, blank=True, help_text="Select the projects that this user is currently working on.") 以及项目的模型代码: class Project(models.Model): name = models.CharField(max_length=100, unique=True) application_identifier = models.CharField(max_length=100) type = models.IntegerField(choices=ProjectType) account = models
  • 具有一对一关系的 Django 模型?(Django models with OneToOne relationships?)
    问题 假设我正在使用默认的auth.models.User加上我的自定义Profile和Address模型,如下所示: class Profile(models.Model): user = models.OneToOneField(User) primary_phone = models.CharField(max_length=20) address = models.ForeignKey("Address") class Address(models.Model): country = CountryField(default='CA') province = CAProvinceField(default='BC') city = models.CharField(max_length=80) postal_code = models.CharField(max_length=6) street1 = models.CharField(max_length=80) street2 = models.CharField(max_length=80, blank=True, null=True) street3 = models.CharField(max_length=80, blank=True, null=True) 现在我想创建一个注册表单。
  • Django:使用形式在一个模板中的多个模型(Django: multiple models in one template using forms [closed])
    问题 关门了。 这个问题需要更加集中。 它当前不接受答案。 想改善这个问题吗? 更新问题,使其仅通过编辑此帖子即可解决一个问题。 2年前关闭。 改善这个问题 我正在构建一个支持票证跟踪应用程序,并希望在一个页面上创建一些模型。 票证通过ForeignKey属于客户。 注释也通过ForeignKey属于票证。 我想选择一个客户(这是一个单独的项目),或者创建一个新的客户,然后创建一个工单,最后创建一个分配给新工单的便笺。 由于我是Django的新手,因此我倾向于反复工作,每次尝试新功能。 我玩过ModelForms,但我想隐藏一些字段并进行一些复杂的验证。 似乎我正在寻找的控制级别需要表单集或手动完成所有操作,并带有一个繁琐的手工编码模板页面,而我试图避免这种情况。 我缺少一些可爱的功能吗? 有人对使用表单集有很好的参考或示例吗? 我花了整个周末为他们准备API文档,但我仍然一无所知。 如果我分解并手工编码所有内容,这是设计问题吗? 回答1 使用ModelForms实在不是很困难。 假设您有A,B和C表格。您打印出每个表格和页面,现在需要处理POST。 if request.POST(): a_valid = formA.is_valid() b_valid = formB.is_valid() c_valid = formC.is_valid() # we do this
  • Django Admin弹出功能(Django Admin popup functionality)
    问题 这个主题相当普遍(在此处最明确地详细介绍:http://www.hoboes.com/Mimsy/hacks/replicating-djangos-admin/),但是我仍然遇到麻烦。 我正在尝试使用管理站点中使用的“加号”按钮功能,在该站点中可以向链接条目添加其他外键。 在管理站点中,将显示一个弹出窗口,允许用户提交新字段,然后在原始表单上填充该新值。 我认为我的问题主要围绕以下内容: 在base.html模板和popadd.html模板中。 单击加号按钮不会弹出新窗口。 popadd模板仅在同一选项卡中加载。 提交新条目不会使用户回到原始表单。 管理站点正常运行。 我在settings.py文件中包含ADMIN_MEDIA_PREFIX ='/ media / admin /'。 它与RelatedObjectLookups.js的住处有关吗? 它当前在我的项目文件夹之外的admin目录中。 我必须创建一个符号链接吗? 很抱歉出现菜鸟问题。 将不胜感激任何建议(尽可能详细)。 回答1 遵循以下概述的步骤,您可以重新创建Django admin的相关对象弹出功能,而无需创建任何自定义小部件,视图和url。 这些步骤假定您尝试在您自己的自定义管理站点中使此弹出窗口正常工作,该站点将Django的admin子类化。 让我们假设以下两个模型Book和Author
  • 在 Django 管理站点中显示自定义模型验证异常(Showing custom model validation exceptions in the Django admin site)
    问题 我有一个预订模型,需要检查被预订的物品是否可用。 我想让背后的逻辑确定该项目是否集中可用,以便无论我在哪里保存实例,此代码都会验证它是否可以保存。 目前,我在我的模型类的自定义保存函数中有此代码: def save(self): if self.is_available(): # my custom check availability function super(MyObj, self).save() else: # this is the bit I'm stuck with.. raise forms.ValidationError('Item already booked for those dates') 这工作正常 - 如果项目不可用,则会引发错误,并且我的项目未保存。 我可以从前端表单代码中捕获异常,但是 Django 管理站点呢? 如何让我的异常像管理站点中的任何其他验证错误一样显示? 回答1 在 django 1.2 中,添加了模型验证。 您现在可以向引发 ValidationError 异常的模型添加一个“clean”方法,并且在使用 django admin 时会自动调用它。 在使用 django admin 时会调用clean()方法,但不会在save()上调用。 如果您需要在管理员之外使用clean()方法,则需要自己显式调用clean() 。
  • 如何为Django管理模型添加实例表单设置初始数据?(How to set initial data for Django admin model add instance form?)
    问题 在显示表单之前,如何在自动生成的表单中设置字段的初始值以添加Django模型实例? 我正在使用Django 1.3.1。 我的模型如下: class Foo(models.Model): title = models.CharField(max_length=50) description = models.TextField() 当前的管理表单真的没什么特别的 class FooAdmin(admin.ModelAdmin): ordering = ('title',) 当我使用管理页面添加Foo的新实例时,我得到一个漂亮的表格,其中包含用于标题和描述的空字段。 我想要的是描述字段设置有我通过调用函数获得的模板。 我目前达到该目标的最佳尝试是: def get_default_content(): return 'this is a template for a Foo description' class FooAdminForm(django.forms.ModelForm): class Meta: model = Foo def __init__(self, *args, **kwargs): kwargs['initial'].update({'description': get_default_content()}) super(FooAdminForm
  • 创建Django表格(creating django forms)
    问题 我正在努力弄清django表格。.我一直在阅读各种文档,但只是不太了解这些概念。 我必须掌握模型,视图和模板。 我想要做的是创建一个包含由下拉列表和复选框组成的各种字段的表单,这些列表由数据库中的值填充。 我有一个名为vms的工作应用程序。 使用models.py,我构建了一个包含大小和类型的简单架构。 大小由“小”,“中”和“大”组成。 类型是“ windows”和“ linux”。 使用管理网站,我可以添加一个额外的大小,例如“特大”。 我想做的是创建一个具有vm大小下拉列表的表单。 如果通过管理网站添加了额外的尺寸,我希望该尺寸显示在下拉列表中。 我会尝试编写代码,但实际上在概念上挣扎。 谁能帮助我完成上述任务? 谢谢奥利 回答1 表单只是一种工具,用于简化和加速从请求中获取POST数据的过程(开发)。 手动方式是对所有以HTML格式存在的字段执行request.POST.get('somefield') 。 但是Django可以做得更好... 本质上,Form类包含许多Field并执行以下任务: 显示HTML输入, 用户提交数据时收集并验证数据, 如果字段未通过验证,则将值和错误消息返回到HTML, 如果所有字段都通过验证,则提供form.cleaned_data字典,作为在视图中访问这些值的便捷方法。 使用这些值,然后可以手动创建MyModel的新实例并保存它。
  • Django 表单,在 Meta 类中有多个“模型”?(Django Forms, having multiple “Models” in Meta class?)
    问题 我们可以在 Form 的“元类”部分定义多个模型吗? 这是我的例子: from django import forms from django.contrib.auth.models import User , Group from django.forms import ModelForm from django.utils.translation import ugettext as _ from profiles.models import Student , Tutor class RegistrationForm(ModelForm): email = forms.EmailField(label=_('Email Address:')) password = form.CharField(label=_('Passsword:') , widget = forms.PasswordInput(render_value = False)) password1 = form.CharField(label=_('Verify Passsword:') , widget = forms.PasswordInput(render_value = False)) class Meta: model = [Student , Tutor] ## IS THIS TRUE
  • Django注册和Django个人资料,使用您自己的自定义表单(Django-Registration & Django-Profile, using your own custom form)
    问题 我正在使用django-registration和django-profile来处理注册和配置文件。 我想在注册时为用户创建一个配置文件。 我创建了一个自定义注册表单,并使用以下教程将其添加到urls.py: http://dewful.com/?p=70 本教程中的基本思想是覆盖默认注册表单以同时创建配置文件。 forms.py-在我的个人资料应用程序中 from django import forms from registration.forms import RegistrationForm from django.utils.translation import ugettext_lazy as _ from profiles.models import UserProfile from registration.models import RegistrationProfile attrs_dict = { 'class': 'required' } class UserRegistrationForm(RegistrationForm): city = forms.CharField(widget=forms.TextInput(attrs=attrs_dict)) def save(self, profile_callback=None): new_user
  • 如何在Django ModelForm中过滤ForeignKey选择?(How do I filter ForeignKey choices in a Django ModelForm?)
    问题 假设我的models.py包含以下内容: class Company(models.Model): name = ... class Rate(models.Model): company = models.ForeignKey(Company) name = ... class Client(models.Model): name = ... company = models.ForeignKey(Company) base_rate = models.ForeignKey(Rate) 即有多个Companies ,每个Companies都有不同的Rates和Clients 。 每个Client应有一个从其母公司Company's Rates选择的基本Rate ,而不是从另一个Company's Rates 。 创建用于添加Client的表单时,我想删除“ Company选项(因为已经通过“ Company页面上的“添加客户”按钮选择了该选项),并将“ Rate选项也限制为该Company 。 我该如何在Django 1.0中做到这一点? 目前,我当前的forms.py文件只是样板: from models import * from django.forms import ModelForm class ClientForm(ModelForm): class Meta
  • 在Django中,null = True和blank = True有什么区别?(What is the difference between null=True and blank=True in Django?)
    问题 想要改善这篇文章吗? 提供此问题的详细答案,包括引文和为什么您的答案正确的解释。 答案不够详细的答案可能会被编辑或删除。 当我们在Django中添加数据库字段时,通常会这样写: models.CharField(max_length=100, null=True, blank=True) 对ForeignKey , DecimalField等进行相同的操作。 null=True仅null=True blank=True仅blank=True null=True , blank=True 关于不同的字段( CharField , ForeignKey , ManyToManyField , DateTimeField )。 使用1/2/3的优点/缺点是什么? 回答1 null=True在数据库的列上设置NULL (与NOT NULL )。 Django字段类型(如DateTimeField或ForeignKey空白值将作为NULL存储在数据库中。 blank确定是否需要表单中的字段。 这包括管理员和您的自定义表单。 如果blank=True则不需要该字段,而如果为False ,则该字段不能为空白。 两者的组合是如此频繁,因为通常如果您要允许表单中的字段为空白,则还需要数据库以允许该字段的NULL值。 CharField和TextField是一个例外
  • Django,如何生成没有模型的管理面板?(Django, how to generate an admin panel without models?)
    问题 我正在构建一个相当大的项目,主要包括以下内容: 服务器 1:基于冰的服务。 Glacier2 用于会话处理。 防火墙允许访问 Glacier2。 服务器 2:通过 Glacier2 提供 Ice 服务的 Web 界面(读取、公开)。 通过 Glacier 2 的 Ice 服务管理界面。 我关心的一点是网络界面。 我想使用 Django,因为它都是用 python 编写的,并且具有非常有用的自动管理面板生成器。 Web 界面不访问任何数据库。 它通过 Glacier2 路由器连接到服务器 #1 上的 Ice 服务,并使用这些服务公开的 API 来操作数据。 你可能知道,Django 中的 admin 生成依赖于 Django ORM 的使用; 我没有使用它,因为我没有要访问的数据库。 所以我需要生成管理面板,但是,我需要拦截任何“db-access”调用并将它们转换为 Ice 服务调用,然后获取服务的输出(如果有),将其转换为 ORM 通常返回的任何内容并将控制权返回给 Django。 有谁知道我怎么能做到这一点? 我需要子类化什么? 有什么具体的想法吗? 谢谢你的时间。 回答1 我认为可能有比编写自定义 ORMS 更简单的方法来获得您想要的管理集成。 我在一个允许通过他们的控制面板 API 管理 Webfaction 电子邮件帐户的应用程序中使用它。 在此处查看models
  • 预填充内联FormSet?(Pre-populate an inline FormSet?)
    问题 我正在为一个乐队准备考勤表。 我的想法是在表格的一部分中输入事件信息以进行表演或排练。 这是事件表的模型: class Event(models.Model): event_id = models.AutoField(primary_key=True) date = models.DateField() event_type = models.ForeignKey(EventType) description = models.TextField() 然后,我想要一个内联FormSet,将乐队成员链接到事件并记录他们是否存在,不在场或被原谅: class Attendance(models.Model): attendance_id = models.AutoField(primary_key=True) event_id = models.ForeignKey(Event) member_id = models.ForeignKey(Member) attendance_type = models.ForeignKey(AttendanceType) comment = models.TextField(blank=True) 现在,我想做的是使用所有当前成员的条目预填充此内联FormSet,并默认将它们存在(大约60个成员)。 不幸的是
  • 这是验证Django模型字段的方法吗?(Is this the way to validate Django model fields?)
    问题 据我了解,当创建一个Django应用程序时,数据会先通过表单进行验证,然后再将其插入模型实例中,然后再写入数据库中。 但是,如果我想在数据模型层上创建一个额外的保护层,那么在目前的“最佳实践”之下我做了什么? 我试图确保审稿人的姓名不会被遗漏或保留为空白。 我是否应该像在此所做的那样在“ clean”方法中放入任何自定义验证,然后将“ save”调用为“ clean”的“ full_clean”调用?如果不是,首选方法是什么? class Reviewer(models.Model): name = models.CharField(max_length=128, default=None) def clean(self, *args, **kwargs): if self.name == '': raise ValidationError('Reviewer name cannot be blank') super(Reviewer, self).clean(*args, **kwargs) def full_clean(self, *args, **kwargs): return self.clean(*args, **kwargs) def save(self, *args, **kwargs): self.full_clean() super(Reviewer
  • 带有外键的 Django 表单(Django forms with Foreign keys)
    问题 我有一个用户可以拥有多本书的场景。 我可以为用户和书籍创建两个不同的模型,并使用外键将它们关联起来(或者一对多将是正确的方式?)。 我为用户模型创建了一个 Django 表单,但是当我在模板中喜欢这个{{form.as_p}} 时,只显示用户模型字段而不是书籍字段。 我希望我的书籍模型提交的用户字段也显示(比如书名字段多次,因为他可以有多本书) ,请让我知道是否可以使用 django 表单/模型,或者我必须使用简单的 html 表单jquery,然后将数据保存在模型中。 谢谢 编辑:我的模型: class Product(models.Model): categories = models.CharField(max_length=5, choices = settings.CATEGORIES) name = models.CharField(max_length=100) description = models.TextField() currency = models.CharField(max_length=5, choices = settings.CURRENCY) status = models.BooleanField(default=True) def __unicode__(self): return self.name class Prices