私のDjangoウェブサイトのすべてのページにフッターリンク「フィードバック/質問」があります。新しい人がサイトに来てそのリンクをクリックすると、プルダウンのあるフォームに誘導され、フィードバックがあるのかどうか、自分のメールアドレスとフィードバックや質問のフィールドが表示されます。ページには、認証されていないすべてのユーザーに表示される単純なヘッダーが表示されます。一方、サイトメンバーがサインインして認証されている場合、同じフォームが表示されますが、電子メールフィールドはありません(私はすでに電子メールアドレスを知っているので)、サイトの内部ナビゲーションバー、ボタンなどを含む別の認証ヘッダー自分のモデルのフォームを持っているでしょうDjangoモデルの継承を使用する場合、この冗長性を避けるにはどうすればよいですか?
class AnonFeedbackQuestion(FeedbackQuestion):
email = models.EmailField(...)
class Meta:
db_table = anon_feedback_question
class AuthFeedbackQuestion(FeedbackQuestion):
user = models.ForeignKey(User, related_name="user")
class Meta:
db_table = auth_feedback_question
これらの2つのクラスを:
class FeedbackQuestion(models.Model):
submission_type = ... (type, i.e. feedback or question)
submission_text = ... (actual feedback or question)
...
class Meta:
abstract = True
は、その後私は2つの別々の具体的な子クラスを作成したい:
私の最初に考えたのは、抽象クラスFeedbackQuestionを作成することでした。
class AnonFeedbackQuestionForm(ModelForm):
class Meta:
model = AnonFeedbackQuestion
fields = ['submission_type', 'submission_text', 'email']
class AuthFeedbackQuestionForm(ModelForm):
class Meta:
model = AuthFeedbackQuestion
fields = ['submission_type', 'submission_text']
私はforsee問題は、私はフィードバックフォームを表示する私の見解では次のことを行う必要がありますということです。
たフォームを識別するために、これらのif/then /他のブロックを繰り返すことdef get_feedback_questions(request, template):
if request.method == 'POST':
...
if request.user.is_authenticated():
form = AuthFeedbackQuestionForm(request.POST)
else:
form = AnonFeedbackQuestionForm(request.POST)
if form.is_valid():
(process form)
...
else:
if request.user.is_authenticated():
form = AuthFeedbackQuestionForm(request.POST)
else:
form = AnonFeedbackQuestionForm(request.POST)
...
context = {'form': form}
return render(request, template, context)
使用するのはむしろ控えめであるように見える。これを行うためのより良い、よりクリーンな "Django"の方法はありますか?
ありがとう!
ありがとうございますが、このソリューションは2つの理由でうまく機能しません。 #1電子メールフィールドが空白/ヌルの場合、匿名ユーザーが電子メールなしでフォームを送信すると、電子メールフィールドにエラーは表示されません。 #2電子メールフィールドを必須にして#1を修正し、認証されたユーザーが他のフィールドにエラーのあるフォームを送信すると、電子メールフィールドが再度表示され、値がないためエラーとしてフラグが立てられます。私は他の解決策を探し続けています。 – William
@Robertは、必要に応じてフィールドを設定するかどうかは、モデルレベルではなく、フォームレベルにする必要があります。それはあなたの問題の第1を解決するはずです。 2番は問題ではありません。何があっても、2つの可能性しか持たないはずです:フィールドが存在し、必須であるか、存在しないかのいずれかです。私の更新された答えを参照してください、意味がありますか? – YPCrumble
@YPCrumbleなぜモデルをサブクラス化しないのでしょうか? –