我有一个简单的应用程序(关于QR码)我有两个模型。第一个用于定义QR码,第二个用于赋予其功能。 (对于那些想知道的人:我将它分成两个模型,因为我们的QR码很复杂,有时缺乏功能并且是只读的。我希望尽可能保持数据库的标准化。)
这是模型(models.py):
public_tweets = api.home_timeline()
for tweet in public_tweets:
print('From :', tweet.user.screen_name, ', Text :', tweet.text)
mixin QRCodeable是一个抽象基类,它为函数提供了与QR码的OneToOne关系。 mixin UniversallyUniqueIdentifiable给它一个uuid。
无论如何,我现在希望能够在Django管理员中创建具有功能的QR码。所以我写了自己的管理类(admin.py):
from django.core.exceptions import ObjectDoesNotExist
from django.db import models
from django.utils.translation import ugettext_lazy as _
from core.behaviors import QRCodeable, UniversallyUniqueIdentifiable
from core.utils import QR_CODE_FUNCTIONS
from model_utils.fields import StatusField
from model_utils.models import SoftDeletableModel, TimeStampedModel
QR_CODE_PREFIX = "QR Code"
QR_CODE_FUNCTION_PREFIX = "Function"
QR_CODE_FUNCTION_MIDFIX = "for"
class QRCode(
UniversallyUniqueIdentifiable,
SoftDeletableModel,
TimeStampedModel,
models.Model
):
@property
def function(self):
try:
return self.qrcodefunction.qr_code_function
except ObjectDoesNotExist:
return ""
class Meta:
verbose_name = _('QR code')
verbose_name_plural = _('QR codes')
def __str__(self):
return f'{QR_CODE_PREFIX} {self.uuid}'
class QRCodeFunction(
UniversallyUniqueIdentifiable,
SoftDeletableModel,
TimeStampedModel,
QRCodeable,
models.Model
):
QR_CODE_FUNCTIONS = QR_CODE_FUNCTIONS
qr_code_function = StatusField(choices_name="QR_CODE_FUNCTIONS")
class Meta:
verbose_name = _('QR code function')
verbose_name_plural = _('QR code functions')
def __str__(self):
return f'{QR_CODE_FUNCTION_PREFIX} {self.qr_code_function} {QR_CODE_FUNCTION_MIDFIX} {self.qr_code}'
此代码会生成以下管理界面:
如果我现在点击from django.contrib import admin
from .models import QRCode, QRCodeFunction
class QRCodeFunctionInline(admin.TabularInline):
model = QRCodeFunction
extra = 0
@admin.register(QRCode)
class QRCodeAdmin(admin.ModelAdmin):
save_on_top = True
search_fields = ['qrcodefunction__qr_code_function']
list_display = (
'__str__',
'function',
)
inlines = [
QRCodeFunctionInline,
]
,选择一个功能并点击保存,新的QR码功能实例 NOT 就会被创建!这是为什么?如何编写此模型管理员以便我可以在QR码管理员中创建QR码的功能?
答案 0 :(得分:0)
这可能是Django Admin not saving pre-populated inline fields which are left in their initial state的副本。您的内联将仅使用默认值,但是如果更改了一个或多个字段,则默认情况下,Django的管理员实际上不会创建实例。这是一个痛苦的经历,但是Django在这里有些谨慎。最好不要创建而不是创建并删除它。
针对您的情况进行调整的该问题的答案将是:
from django.contrib import admin
from django.forms.models import ModelForm
class AlwaysChangedModelForm(ModelForm):
def has_changed(self):
""" Should returns True if data differs from initial.
By always returning true even unchanged inlines will get validated and saved."""
return True
class QRCodeFunctionInline(admin.TabularInline):
model = QRCodeFunction
form = AlwaysChangedModelForm
extra = 0