0

私のWebサイトには、3つのテーブル(宿題、クラス、ランダム)で同じフォームがあります。基本的に、フォームの上部にChoiceFieldを作成して、ユーザーがファイルをアップロードする場所を選択できるようにします。

これらのテーブルには共通の抽象クラスがあるので、どういうわけかそこから選択できるのではないかと思っていました。しかし、その方法を理解することはできません。

または、これにははるかに優れた解決策があるかもしれません。

これが私のコードである場合に備えて:

#models.py
class FileDescription(models.Model):

    class Meta:
        abstract = True;
        ordering = ['file_creation_time']

    subject = models.ForeignKey('Subjects', null=True, blank=True, primary_key=True)
    subject_name = models.CharField(max_length=100)
    file_uploaded_by = models.CharField(max_length=100)
    file_name = models.CharField(max_length=100)
    file_description = models.TextField()
    file_creation_time = models.DateTimeField(auto_now_add=True)

    def __unicode__(self):
        return u'%s' % (self.file_name)

#template
<ul id="tabs">
        <li><a href="#homework">Homework</a></li>
        <li><a href="#class-papers">Class Papers</a></li>
        <li><a href="#random-papers">Random Papers</a></li>
    </ul>

    <div id="homework" class="tab-section">
        <h2>Homework</h2>
        <p>This section contains Homework</p>

            {% if homework_files %}
                <ul>
                    {% for file in homework_files %}
                        <li>{{ file.file_name }}
                    {% endfor %}
                </ul>
            {% endif %}
    </div>

#forms.py
class Homework_Content_Form(forms.ModelForm):
    class Meta:
        model=Homework_Content
        exclude=('subject', 
                 'subject_name',
                 'file_creation_time',
                 'file_uploaded_by',
                 )
4

1 に答える 1

1

方法1:フォームを分離する

class GenericContentForm(forms.ModelForm):
     class Meta:
         exclude = ('subject', 'subject_name', 'file_creation_time', 'file_uploaded_by')

     TYPE_CHOICES = (
         ('homework', 'Homework'),
         ('class', 'Class Paper'),
         ('random', 'Random Paper'),
     )

     type = forms.ChoiceField(choices=TYPE_CHOICES)

class HomeworkForm(GenericContentForm):
     class Meta(GenericContentForm.Meta):
         model = Homework

class ClassPaperForm(GenericContentForm):
     class Meta(GenericContentForm.Meta):
         model = ClassPaper

class RandomPaperForm(GenericContentForm):
     class Meta(GenericContentForm.Meta):
         model = RandomPaper

次に、ビューで最初に1つを選択し、POSTデータがある場合は、代わりに別のデータをインスタンス化できます。

def my_view(request):
    if request.method == 'POST':
        type = request.POST.get('type')
        if type == 'homework':
            form = HomeworkForm(request.POST)
        elif type == 'class':
            form = ClassPaperForm(request.POST)
        elif type == 'random':
            form = RandomPaperForm(request.POST)

    else:
        form = HomeworkForm()

    ...

方法2:プロキシモデルを使用する

これらの3つのモデルはすべて同じデータを共有するため、3つの別々のテーブルを持つことは冗長です。抽象的ではなくFileDescription、通常の標準モデルにし、「宿題」、「クラスペーパー」、「ランダムペーパー」を選択して、タイプ用のフィールドを追加します。次に、それぞれのプロキシモデルを作成します。

class HomeworkManager(models.Manager):
    def get_query_set(self, *args, **kwargs):
        qs = super(HomeworkManager, self).get_query_set(*args, **kwargs)
        return qs.filter(type='homework')

class Homework(FileDescription):
    class Meta:
        proxy = True

    objects = HomeworkManager()

    def save(self, *args, **kwargs):
        self.type = 'homework'
        super(Homework, self).save(*args, **kwargs)

FileDescription次に、 「タイプ」に対するユーザーの選択が保存されるための1つのフォームが必要です。その後、標準で「宿題」タイプとして設定されたものすべてにアクセスできますHomework.objects.all()

于 2012-07-25T15:54:52.987 に答える