![](/img/trans.png)
[英]Django inlineformset_factory in UpdateView formset data is not update
[英]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
是構成反饋表單的FeedbackForm
和FeedbackQuestion
之間的關系(多對多)。 其他模型僅用於分析和圖表。
這是 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>
我已經多次使用過這樣的訪問外鍵數據,但不知道為什么它不來這里。
由於您不想讓用戶 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.