簡體   English   中英

Django 訪問 InlineFormset_Factory 中的外鍵表數據

[英]Django Access Foreign Key Table's Data in InlineFormset_Factory

我正在使用表單集創建反饋頁面,但無法訪問 django 模板中的外鍵表值。

我在下面有這個模型,用於反饋系統。

模型.py

class FeedbackForm(amdl.AagamBaseModel):
    feedback_form_id = models.AutoField(primary_key=True)
    subject_teacher = models.ForeignKey(MapMySchoolUserSubject, models.DO_NOTHING)
    feedback_form_date = models.DateField()
    feedback_form_status = models.BooleanField()

    class Meta:
        db_table = 'feedback_form'

class FeedbackFormQuestion(amdl.AagamBaseModel):
    feedback_form_question_id = models.AutoField(primary_key=True)
    feedback_form = models.ForeignKey('FeedbackForm', models.DO_NOTHING)
    feedback_question = models.ForeignKey('FeedbackQuestion', models.DO_NOTHING)

    class Meta:
        db_table = 'feedback_form_question'

class Feedback(amdl.AagamBaseModel):
    feedback_id = models.AutoField(primary_key=True)
    feedback_form_question = models.ForeignKey('FeedbackFormQuestion', models.DO_NOTHING)
    map_myschool_user_standard_section = models.ForeignKey(MapMySchoolUserStandardSection, models.DO_NOTHING)
    feedback_rating = models.IntegerField()
    feedback_comments = models.TextField(blank=True, null=True)
    feedback_date = models.DateTimeField(auto_now_add=True)

    class Meta:
        db_table = 'feedback'

class FeedbackQuestion(amdl.AagamBaseModel):
    feedback_question_id = models.AutoField(primary_key=True)
    question_text = models.TextField()
    feedback_question_credit = models.IntegerField()
    question_group = models.ForeignKey('FeedbackQuestionGroup', models.DO_NOTHING)

    class Meta:
        db_table = 'feedback_question'

class FeedbackQuestionGroup(amdl.AagamBaseModel):
    feedback_question_group_id = models.AutoField(primary_key=True)
    question_group = models.TextField()
    description = models.TextField()

    class Meta:
        db_table = 'feedback_question_group'

Feedback model 是主要的 model,其中反饋的評級由學生給出。 由於評分是針對每個問題的,因此每個問題有一行是外鍵, FeedbackFormQuestion是構成反饋表單的FeedbackFormFeedbackQuestion之間的關系(多對多)。 其他模型僅用於分析和圖表。

這是 Model 的表單集的視圖,它基於管理 html 中的外觀的FORM (顯示在 view.py 之后)。 需要使用 MySchoolUSer 數據處理多個 forms 的表單集對所有人都是相同的。 視圖.py

def aagam_feedback(request):
    model_formset = inlineformset_factory(MapMySchoolUserStandardSection, Feedback, fields=('feedback_form_question','feedback_rating','feedback_comments'), form=FormFeedback, can_delete=False)                                  
    stud_nav = views.student_navbar(request)
    stud = MapMySchoolUserStandardSection.objects.get(pk=stud_nav['standard_section_current']['pk'])
    formset = model_formset(queryset=Feedback.objects.none(), instance=stud, initial=[{'feedback_form_question': 4}, {'feedback_form_question': 4}])

    if request.method == "POST":
        formset = model_formset(request.POST, instance=stud)
        if formset.is_valid():
            formset.save()
            return redirect("/")

    return render(request, 'StudentFeedback/aagam_feedback.html', {'formset': formset})

表格.py

from django import forms
from django.forms import ModelForm
from StudentFeedback import models


class FormFeedback(ModelForm):
    CHOICES = [(1, ''),
               (2, ''),
               (3, ''),
               (4, ''),
               (5, '')]
    feedback_rating = forms.ChoiceField(choices=CHOICES, widget=forms.RadioSelect(), label=False, label_suffix=False)

    class Meta:
        model = models.Feedback
        fields = ['feedback_form_question', 'feedback_rating', 'feedback_comments']

這是 html 但我無法從外鍵表中訪問此數據。html

<form method="POST">
  {% csrf_token %}
    {{ formset.management_form }}
    {% for form in formset %}
        // Want to access the question_text below but it is blank.
        {{ form.feedback_form_question.feedback_question.question_text }}
        {% for rating in form.feedback_rating %}
            {{ rating }}
        {% endfor %}
        {{ form.feedback_comments }}
    {% endfor %}
    <input type="submit" class="btn btn-primary col-sm-12" data-toggle="button" aria-pressed="false">
</form>

output

輸出

預期 output

預期產出

我已經多次使用過這樣的訪問外鍵數據,但不知道為什么它不來這里。

由於您不想讓用戶 select 問題只是在您的表單上禁用該字段:

class FormFeedback(ModelForm):
    CHOICES = [(1, ''),
               (2, ''),
               (3, ''),
               (4, ''),
               (5, '')]
    feedback_rating = forms.ChoiceField(choices=CHOICES, widget=forms.RadioSelect(), label=False, label_suffix=False)
    feedback_form_question = forms.ModelChoiceField(
        queryset=FeedbackFormQuestion.objects.all(),
        disabled=True,
    )

    class Meta:
        model = models.Feedback
        fields = ['feedback_form_question', 'feedback_rating', 'feedback_comments']

現在在你的表單中,而不是寫{{ form.feedback_form_question.feedback_question.question_text }}這真的沒有意義,因為form.feedback_form_question是一個表單字段,而不是為該字段存儲的值。 相反,因為現在我們只是將我們的字段設置為禁用 go 並渲染該字段(即使用戶篡改 html 它也不會被表單占用)。 此外,每當處理 forms 時,應始終記住渲染隱藏字段,在添加幾個重要隱藏字段的表單集的情況下更是如此:

<form method="POST">
  {% csrf_token %}
    {{ formset.management_form }}
    {% for form in formset %}
        <!-- Render the hidden fields -->
        {% for field in form.hidden_fields %}
            {{ field }}
        {% endfor %}
        <!-- Render the field -->
        {{ form.feedback_form_question }}
        {% for rating in form.feedback_rating %}
            {{ rating }}
        {% endfor %}
        {{ form.feedback_comments }}
    {% endfor %}
    <input type="submit" class="btn btn-primary col-sm-12" data-toggle="button" aria-pressed="false">
</form>

您可以覆蓋__str__的 __str__ 來修改顯示的內容:

class FeedbackFormQuestion(amdl.AagamBaseModel):
    # Your implementation
    
    def __str__(self):
        return self.feedback_question.question_text

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM