私は Django を始めて 1 か月か 2 か月経ちましたが、プログラミングについて十分な教育を受けていません。私が見つけたよりも簡単かもしれません。
私のプロジェクトでは、さまざまな種類の質問を使用してチュートリアルから投票アプリを拡張しています。各質問タイプには、異なる回答フィールドとオプションがあります。Answer_Type セットに応じて、 のモデルから関連するインラインを表示 (または非表示) したいと考えています。ModelAdmin で「追加」ビューと「変更」ビューをオーバーロードする方法を見つけました。
class Question(models.Model):
ANSWER_TYPE_CHOICES = (
('CH', 'Choice'),
('SA', 'Short Answer'),
('LA', 'Long Answer'),
('E3', 'Expert Judgement of Probabilities'),
('E4', 'Expert Judgment of Values'),
('RR', 'Risk Rating'),
)
answer_type = models.CharField(max_length = 2,
choices= ANSWER_TYPE_CHOICES,
default='SA')
question_text = models.CharField(max_length=200, default = "nil")
max_entries = models.IntegerField(default = 1)
man_index = models.IntegerField(default = 0)
(2 つの例 - 1 つ目はインラインを必要とせず、2 つ目はリスク評価の質問ごとの定義を可能にするためにインラインを必要としません):
class Long_Answer(models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE)
user = models.ForeignKey(User, on_delete=models.CASCADE, default = 1)
long_answer = models.CharField(max_length=2000)
def __str__(self):
return self.long_answer
class Estimated_risk(models.Model):
# This is for those situations where the aggregate estimate is expected to be a more reliable expert judgment than the paramaterised (prob, cons) estimate.
# Risk value (a number) would be a real-world expected value of losses, for example
# It would be appropriate for a question to have risk and confidence
risk_value = models.DecimalField(max_digits = 4, decimal_places = 3)
risk_definition = models.CharField(max_length = 250)
risk_short_name = models.CharField(max_length = 10)
この問題を解決する方法がわからないことを理解するために私が書いた admin.py クラス (これは機能しませんが、うまくいけば、私が望んでいたことを伝えます):
`class QuestionAdmin(admin.ModelAdmin):
fieldsets = [
('Question', {'fields': ['question_text']}),
('Type', {'fields': ['answer_type'], 'classes': ['collapse']}),
('Maximum Answers per User', {'fields': ['max_entries']}),
('Presentation order (unique)', {'fields': ['man_index']}),
]
inlines =()
def set_inlines(self, request, object_id, form_url='', extra_context = None):
if self.fieldsets['Type'] == 'CH':
return [ChoiceInline]
if self.fieldsets['Type'] == 'SA':
return None
if self.fieldsets['Type'] == 'LA':
return None
if self.fieldsets['Type'] == 'E3':
return None
if self.fieldsets['Type'] == 'E4':
return None
if self.fieldsets['Type'] == 'RR':
return [RiskInline]
inlines = set_inlines(self)`