假设您正在使用新 Django 应用程序的第一个版本,并且不断添加更改模型。
作为数据驱动的应用程序,您主要致力于自定义 django 管理。
在这种情况下syncdb不太有用,因为它将无法更新模型。South很有趣,但是当您在第一个版本中工作时,它没有太大意义。
删除数据库并重新初始化它需要几个命令,并且您还需要手动输入新的管理员帐户。
您建议如何设置您的开发环境,以便您可以:
因此,我希望能够向模型添加新属性、切换到浏览器并刷新管理页面并查看新属性。
在我的 django ModelAdmin 中,我想根据当前用户的组过滤外键选择,并且我想以添加和更改形式实现它。我使用以下代码在添加视图中实现了它。
添加视图
def add_view(self, request, form_url = '', extra_context = None):
service_sector = common.getServiceSector(request.user)
ModelForm = self.get_form(request)
if request.POST:
form = ModelForm(request.POST, request.FILES)
else:
form = ModelForm()
if service_sector:
qs = form['member'].field.queryset
qs = qs.filter(service_sector = service_sector)
form['member'].field.queryset = qs
adminForm = helpers.AdminForm(form, list(self.get_fieldsets(request)),
self.prepopulated_fields, self.get_readonly_fields(request),
model_admin=self)
context = {
'adminform': adminForm,
'is_popup': "_popup" in request.REQUEST,
'show_delete': False,
'root_path': self.admin_site.root_path,
}
context.update(extra_context or {})
return self.render_change_form(request, context, form_url=form_url, add=True)
Run Code Online (Sandbox Code Playgroud)
这里工作正常。在这个模型中,我有一个唯一的字段电子邮件,这导致了 change_view 中的问题。我在下面给出了我的 change_view …
我正在尝试验证上传到 Django Admin 的 CSV 文件 - 以确保它的格式正确等等。
它还依赖于表单中的另一个值,所以我在 formsclean方法中验证它:
def clean(self):
cleaned_data = super(CSVInlineForm, self).clean()
csv_file = cleaned_data.get('csv_file')
contents = csv_file.read()
# ...validate contents here...
return cleaned_data
Run Code Online (Sandbox Code Playgroud)
我的模型保存方法如下所示:
def save(self, *args, **kwargs):
contents = self.csv_file.read()
# ... do something with the contents here ...
return super(CSVModel, self).save(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)
当我读取 clean 方法中的文件内容时,问题就出现了,我无法读取模型 save 方法中的 csv_file (它返回一个空字符串)。在 clean 方法中,我可以读取和解析文件。
该文件上传完美无缺。
如果我在 clean 方法中注释掉 csv_file.read() 行,则 save 方法可以正常工作并且可以读取文件内容。
它的行为好像文件只能读取一次?
如果我重新保存模型,文件读取和解析工作正常。
这一切都在 django admin 中——据我所知,表单正在被正确处理。
假设我有一个简单的模型,models.py可以通过Django Admin编辑:
class Range(models.Model):
gt = models.IntegerField('Greater than')
lt = models.IntegerField('Lesser than')
def clean(self):
if self.gt >= self.lt:
raise ValidationError('Incorrect range')
Run Code Online (Sandbox Code Playgroud)
问题:尽管以上代码在确保gt小于的假设方面做得很好lt,但是它也破坏了Django提供的其他基本验证。例如,如果我在Django admin中为这些字段输入了一些非数字数据,则会看到跨越多个屏幕的调试消息:
如果我clean(self)从的定义中删除了覆盖的方法Range,则此基本验证将再次开始正常工作:
但当然,现在我可以进入Range以s gt大于lt。
我真的不知道我在做什么错,因为我只是按照https://docs.djangoproject.com/zh-CN/1.9/ref/models/instances/#validating-objects遵循Django文档
我的错误在哪里?如何正确地为我的表格提供验证?
如何设置verbose_name的@property,这是我在模型中描述的那样,这样我就可以在Django管理看到不同的字段名称(如"子类别")?
@property
def category_name(self):
return self.category.name
Run Code Online (Sandbox Code Playgroud)
我试图在方法中设置Meta short_description和详细名称 - 它不起作用.
嘿我正在尝试初始化一个新数据库,但我遇到了一些设置迁移的问题.我得到的错误似乎源于设置我的表单.在我正在使用的表单中,我正在创建一个选择字段:
from django import forms
from ..custom_admin import widgets, choices
class MemberForm(forms.Form):
provinces = forms.ChoiceField(label='Provinces', choices=choices.PROVINCE_CHOICES, required=True)
Run Code Online (Sandbox Code Playgroud)
PROVINCE_CHOICES来自这里:
from ..base.models import ProvinceCode
PROVINCE_CHOICES = []
for province in ProvinceCode.objects.filter(country_code_id=1).order_by('code'):
PROVINCE_CHOICES.append((province.code, province.code))
Run Code Online (Sandbox Code Playgroud)
问题似乎是在迁移发生之前调用了这个循环,给出了一个错误,指出省模型不存在.注释掉对该文件的引用允许迁移工作,但这似乎是继续使用的不切实际的解决方案.有没有办法解决这个错误?
作为参考,这是我运行时得到的错误manage.py makemigrations:
./manage.py makemigrations
Traceback (most recent call last):
File "/Users/js/Documents/VirtualEnvironments/pcenv/lib/python3.5/site-packages/django/db/backends/utils.py", line 64, in execute
return self.cursor.execute(sql, params)
psycopg2.ProgrammingError: relation "pc_psr_code" does not exist
LINE 1: ...escription", "pc_psr_code"."country_code_id" FROM "pc_psr_co...
^
The above exception was the direct cause of the following exception:
Traceback (most recent call …Run Code Online (Sandbox Code Playgroud) 请帮我。我放弃。我正在尝试向django管理员添加其他字段。我想在那儿插入图像缩略图。这是我的admin.py的一部分:
class SiteAdmin(admin.ModelAdmin):
list_display = ('is_active', 'name', 'description', 'keywords', 'date')
fields = ('name', 'url', 'category', 'subcategory', 'category1',
'subcategory1', 'description',
'keywords', 'date', 'group', 'email', 'is_active')
readonly_fields = ('date',)
list_display_links = ('name',)
list_filter = ('is_active',)
actions = [activate_sites, deactivate_sites]
Run Code Online (Sandbox Code Playgroud)
我很想将'image'添加到list_display。图像由thumbalizr生成。我在models.py中有一个方法:
class Site(models.Model):
category = models.ForeignKey('Category')
subcategory = ChainedForeignKey(
'SubCategory',
chained_field='category',
chained_model_field='category',
show_all=False,
auto_choose=True,
blank=True, null=True, default=None)
name = models.CharField(max_length=70, verbose_name="Tytu?")
description = models.TextField(verbose_name="Opis")
keywords = MyTextField(max_length=100, verbose_name="S?owa kluczowe")
date = models.DateTimeField(default=datetime.now, editable=False)
url = models.URLField()
is_active = models.BooleanField(default=False)
category1 = models.ForeignKey('Category', related_name='category', …Run Code Online (Sandbox Code Playgroud) 以下是我的模型:
class Product(models.Model):
product_title = models.CharField(max_length=100, null=False,
verbose_name='Product title')
product_description = models.TextField(max_length=250,
verbose_name='Product description')
product_qty = models.IntegerField(verbose_name='Quantity')
product_mrp = models.FloatField(verbose_name='Maximum retail price')
product_offer_price = models.FloatField(verbose_name='Selling price')
def validate_produce_offer_price(sender, instance, **kwargs):
if instance.product_offer_price > instance.product_mrp:
from django.core.exceptions import ValidationError
raise ValidationError('Product offer price cannot be greater than
Product MRP.')
pre_save.connect(validate_produce_offer_price, sender=Product)
Run Code Online (Sandbox Code Playgroud)
我想在保存模型之前验证product_offer_price.验证错误正在成功引发,但是在调试器创建的异常页面上.如何在管理员本身的表单上显示错误,就像管理表单提出的其他错误一样?
我正在尝试django image在这里找到我的副本:https :
//hub.docker.com/r/library/django
好吧,在这一点上图像运行良好,但是我正在尝试从该容器生成一个容器。
好用的命令:
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3c3e94ff32e7 django:latest "python3" 18 hours ago Exited (137) 17 hours ago django
$ docker images -a
REPOSITORY TAG IMAGE ID CREATED SIZE
django latest eb40dcf64078 9 months ago 436MB
Run Code Online (Sandbox Code Playgroud)
使用方法:
$ docker commit django fmf
$ docker run -p 8000:8000 -td fmf /bin/bash
Run Code Online (Sandbox Code Playgroud)
现在,我有了容器,fmf并使用以下命令生成了一个新的django项目:
# django-admin startproject test
# python manage.py runserver 8000
Run Code Online (Sandbox Code Playgroud)
但是,此端口未打开(或者至少我看不到那里的任何响应)。我不确定端口是否未打开并使用网桥,但是此容器没有响应。
我做错了什么?
我已经为博客应用程序创建了模型.这是我的models.py:
from django.db import models
from django.utils import timezone
from django.contrib.auth.models import User
# Create your models here.
class post(models.Model):
STATUS_CHOICE=(
('draft','DRAFT'),
('published','Published'),
)
title=models.CharField(max_length=250)
slug=models.SlugField(max_length = 250,unique_for_date='publish')
author=models.ForeignKey(User,related_name='blog_posts')
body=models.TextField()
publish=models.DateTimeField(default=timezone.now)
created = models.DateTimeField(auto_now_add=True)
updated=models.DateTimeField(auto_now=True)
status = models.CharField(max_length=10,
choices = 'STATUS_CHOICES',
default='draft')
class Meta:
ordering = ('-publish',)
def __str__(self):
return self.title
Run Code Online (Sandbox Code Playgroud)
当我尝试迁移模型时,我收到错误:
ERRORS:
myblog.post.status: (fields.E004) 'choices' must be an iterable (e.g., a list or tuple).
Run Code Online (Sandbox Code Playgroud)
这是我的admin.py文件:
from django.contrib import admin
from .models import post
# Register your models here.
admin.site.register(post) …Run Code Online (Sandbox Code Playgroud)