Django ModelForm с дополнительными полями, которые не находятся в модели

  1. Создайте jquery.ts в том же месте, что и ваш main.ts, и вставьте в него следующее:

    import * как $ из 'jquery';

    [116 ] window ['jQuery'] = window ['$'] = $;

  2. Вставьте следующее в начало вашего main.ts,

    import 'jquery ';

    import' popper.js ';

    import' bootstrap ';

    import' moment ';

    import' jquery-datepicker ';

  3. Удалите любые другие ссылки на скрипты на jquery или начальную загрузку из вашей конфигурации html или angular cli.

37
задан Ciro Santilli 新疆改造中心法轮功六四事件 15 May 2016 в 10:19
поделиться

3 ответа

В Django 2 можно просто добавить поля, поскольку это была нормальная форма

class CreateCompanyForm(forms.ModelForm):

    password_confirmation = forms.CharField(
        label=translate('Password confirmation'),
        max_length=70,
        widget=forms.PasswordInput(),
        required=True,
    )
    company_name = forms.CharField(
        label="Nombre de la Compañía",
        max_length=90,
        widget=forms.TextInput(),
        required=True,
    )

    class Meta:
        model = AppUser
        fields = (
            "email",
            "first_name",
            "last_name",
            "password",
        )
0
ответ дан 27 November 2019 в 04:56
поделиться

Во-первых, у вас не должно быть полей artist_id и artist. Они построены по модели. Если вам нужно какое-то имя исполнителя, добавьте поле artist_name, то есть CharField .

Кроме того, вы пытаетесь получить что-то из cleaned_data внутри чистого значения. Возможно, вам не нужны данные - вы должны использовать значения из self.data, где данные непосредственно из POST.

5
ответ дан 27 November 2019 в 04:56
поделиться

Эта же проблема раздражала меня довольно долго, я сделал несколько тестов и обнаружил следующее:

Если библиотека (nunit в данном случае) скомпилирована с отладочной информацией «none», то если конструкция, аналогичная приведенной ниже, выполняется в библиотеке, и код делегата создает исключение, то VS перестает жаловаться на исключение, не обработанное кодом пользователя.

Код библиотеки:

public static Exception Throws(TestDelegate code, string message)
{
    Exception caughtException = null;

    try
    {
        code();
    }
    catch (Exception ex)
    {
        caughtException = ex;
    }        

    return caughtException;
}

Код клиента:

private void btnTest_Click(object sender, EventArgs e)
{
  var ex = MyAssert.Throws(() => { throw new Exception(); }, "");    
}

Установка для отладочной информации проекта библиотеки любого другого параметра, отличного от «none», устраняет проблему, т.е. отладчик больше не останавливается на этих «необработанных» исключениях. Я протестировал его с помощью nunit и собственной рулонной библиотеки с приведенным выше кодом (взял фрагмент из метода nunit's Throws). Я полагаю, что это функция или «функция» VS.

Это оставляет нам не так много вариантов:

  1. Фильтр исключение, как ранее предлагалось

  2. Recompile nunit.framework.dll для локального использования, чтобы избежать этих раздражающих остановок

Другие варианты могут быть, чтобы связаться либо MS или NUnit команды или оба и попросить их исследовать/прояснить проблему и компилировать NUnit с минимальным уровнем отладочной информации

Изменить:

Найден еще один вариант.

  1. В моем случае снятие флажка «Подавить оптимизацию JIT при загрузке модуля» также делает этот трюк, даже если библиотеки скомпилированы без отладочной информации. Однако он работает только при запуске проекта в конфигурации версии.
-121--3677802-

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

-121--2132462-

OK Я разрешил его. Похоже, что доступ к дополнительным полям с помощью cleaned_data['field_name'] вызывает KeyError, но использование cleaned_data.get («field _ name») работает. Это странно, потому что обычные поля для модели можно получить через cleaned_data['field_name'].

Обновление: Нет, это не работает. Функция get () не вызывает KeyError, но устанавливает значение None, поскольку дополнительные поля отсутствуют в cleaned_data словаре.

Вот код. В шаблонах есть автозавершение, поэтому в форме есть поле «художник», визуализированное как CharField, и скрытое IntegerField, которое будет автоматически заполнено данным идентификатором артиста. В clean_artist методе я хочу выбрать объект художника и сохранить его в поле исполнителя формы.

models.py

class Music(models.Model):
    artist = models.ForeignKey(Artist, related_name='music', blank=True, null=True)
    # other fields...

forms.py

class MusicForm(forms.ModelForm):
    artist_id = forms.IntegerField(label="", widget=forms.HiddenInput(), required=False)
    artist = forms.CharField(required=False)
    # other fields ...

    class Meta:
        model = Music

    def clean_artist(self):
        if self.cleaned_data.get('artist') == '':
            artist = None
        else:
            artist_id = self.cleaned_data.get('artist_id') # this returns always None because artist_id is not in cleaned_fields (this seemed to work with previous django versions but not with current SVN version)
            if artist_id != None:
                artist = Artist.objects.get(id=artist_id)
            else:
                artist = None

    return artist
3
ответ дан 27 November 2019 в 04:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: