Tôi đang cố gắng sử dụng inlineformset_factory để tạo một bộ định dạng. Mô hình của tôi được định nghĩa là:Bộ lọc truy vấn trong Django inlineformset_factory
class Measurement(models.Model):
subject = models.ForeignKey(Subject)
experiment = models.ForeignKey(Experiment)
assay = models.ForeignKey(Assay)
values = models.CommaSeparatedIntegerField(blank=True, null=True)
class Experiment(models.Model):
date = models.DateField()
notes = models.TextField(max_length = 500, blank=True)
subjects= models.ManyToManyField(Subject)
theo quan điểm của tôi, tôi có:
def add_measurement(request, experiment_id):
experiment = get_object_or_404(Experiment, pk=experiment_id)
MeasurementFormSet = inlineformset_factory(Experiment, Measurement, extra=10, exclude=('experiment'))
if request.method == 'POST':
formset = MeasurementFormSet(request.POST,instance=experiment)
if formset.is_valid():
formset.save()
return HttpResponseRedirect(experiment.get_absolute_url())
else:
formset = MeasurementFormSet(instance=experiment)
return render_to_response("data_entry_form.html", {"formset": formset, "experiment": experiment }, context_instance=RequestContext(request))
nhưng tôi muốn để hạn chế lĩnh vực Measurement.subject để chỉ các đối tượng quy định tại các queryset Experiment.subjects. Tôi đã thử một vài cách khác nhau để làm điều này nhưng tôi là một chút không chắc chắn cách tốt nhất để thực hiện điều này là gì. Tôi đã cố gắng để vượt qua lớp BaseInlineFormset với một queryset mới, nhưng không thể tìm ra cách để truyền một cách chính xác tham số thử nghiệm.
câu trả lời Cập nhật (Tôi cũng bao gồm các thông tin từ đây như một cách để vượt qua các tham số cho formset link):
views.py
def add_measurement(request, experiment_id):
experiment = get_object_or_404(Experiment, pk=experiment_id)
MeasurementFormSet = inlineformset_factory(Experiment, Measurement, extra=10, can_delete=True, form=MeasurementForm)
MeasurementFormSet.form = staticmethod(curry(MeasurementForm, experiment=experiment))
if request.method == 'POST':
formset = MeasurementFormSet(request.POST)
if formset.is_valid():
formset.save()
return HttpResponseRedirect(experiment.get_absolute_url())
else:
formset = MeasurementFormSet()
return render_to_response("data_entry_form.html", {"formset": formset, "experiment": experiment }, context_instance=RequestContext(request))
forms.py
class MeasurementForm(ModelForm):
class Meta:
model = Measurement
def __init__(self, *args, **kwargs):
experiment = kwargs.pop('experiment')
super(MeasurementForm, self).__init__(*args, **kwargs)
self.fields["subject"].queryset = Subject.objects.filter(experiment=experiment)
Tôi chưa bao giờ nghe nói về cà ri() bằng Python trước đây, nó chắc chắn không được tích hợp sẵn. EDIT: ... Ahh .. Tôi vừa nhận thấy bài đăng được liên kết: từ django.utils chức năng nhập khẩu cà ri – Rich
Điều này vẫn còn làm việc trong Django 1,5? Tôi nhận được lỗi sau: __init __() nhận được đối số từ khóa không mong muốn 'empty_permitted' – Puzzled79