Проблемы с созданием модели и ее детей из inlineformset_factory - PullRequest
0 голосов
/ 21 ноября 2011

У меня есть модель для загрузки файлов, определенная так:

class UploadedFile(models.Model):
   fpath = models.FileField(...)
   sig   = models.CharField(max_length=32) # for md5 of data, computed with post_save

и у меня есть другая модель, названная MTest, которая имеет это:

class MTest(models.Model):
  file1 = models.ForeignKey("UploadedFile",related_name="first_file")
  file2 = models.ForeignKey("UploadedFile",related_name="second_file")
  ... # other fields here

Я хочу показать форму для MTest, и я хочу позволить пользователю выполнить загрузку файлов за 1 шаг. Из того, что я прочитал здесь и здесь , у меня есть это:

def x_attachment_t(request):
    c = {}

    MTestFormset = inlineformset_factory(UploadedFile, MTest, fk_name="file1",extra=1)

    c.update({"formset":MTestFormset})
    return render_to_response("form.html",c,context_instance=RequestContext(request))

Проблема в том, что я все еще получаю данные, предварительно заполненные для полей загрузки файла, и у меня есть только поле выбора для второго файла. Вот код из шаблона:

    {% for form in formset.forms %}
        <div class="span-21 last">
            {% for field in form %}
                <font color="red">{{ field.errors }}</font>
                <div class="span-4">{{ field.label_tag }}</div>
                <div class="span-17">{{ field }}</div>
            {% endfor %}
        </div>
    {% endfor %}

Пока что я заблокирован и не знаю, как продолжить. Буду признателен за любую помощь:)

1 Ответ

3 голосов
/ 21 ноября 2011

Ваш подход здесь не совсем правильный. Встроенный набор форм - это шаблон для «редактирования нескольких MTest s, связанных с одним и тем же UploadedFile».

Я бы создал модель формы для UploadedFile и Mtest. Исключить поля file1 и file2 из MtestModelForm. Поместите две загруженные формы файла и MtestModelForm в один тег html <form>, используя аргумент prefix.

Тогда, по вашему мнению, если все три формы действительны, используйте сохранить MtestModelForm с commit=False и обновите file1 и file2 перед сохранением в БД.

Вот скелет зрения

def my_view(request):
    if request.method == "POST"
        file1_form = UploadedFileForm(request.POST, request.FILES, prefix="file1")
        file2_form = UploadedFileForm(request.POST, request.FILES, prefix="file2")
        mtest_form = MTestForm(data=request.POST, prefix="mtest")
        if mtest_form.is_valid() and file1_form.is_valid and file2_form.is_valid():
            file1 = file1_form.save()
            file2 = file2_form.save()
            mtest = mtest_form.save(commit=False)
            mtest.file1 = file1
            mtest.file2 = file2
            mtest.save()
            return HttpResponseRedirect("/success-url/")
        # case for invalid form data or GET request omitted
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...