Назначить пользователя, вошедшего в систему, в качестве значения по умолчанию для поля модели - PullRequest
0 голосов
/ 12 января 2020

Это мой код

models.py

class Expense(models.Model):
    category=models.CharField(verbose_name=u"Category:", choices=cat, default=0, max_length=50)
    description=models.CharField(verbose_name=u'Description:', max_length=50)
    cost=models.DecimalField(verbose_name=u'Cost:', max_digits=5, decimal_places=2)
    date=models.DateField(auto_now_add=True)
    createdBy=models.ForeignKey(User, on_delete=models.CASCADE, blank=True)
    class Meta:
        ordering = ['date']

admin.py

class ExpenseAdmin(admin.ModelAdmin):
    list_display=('category', 'description', 'cost', 'date', 'createdBy')
    list_filter=('category', 'description', 'date')
    search_fields=('category', 'description', 'date')
    fieldsets = [
        (None, { 'fields': [('category', 'description', 'cost')] } ),
    ]
    def save_model(self, request, obj, form, change):
        if getattr(obj, 'createdBy', None) is None:
            obj.createdBy = request.user
        obj.save()

views.py

def newExpense(request):
    form=ExpenseForm(request.POST or None)
    if form.is_valid():
        form.save()

        return redirect(monthExpense)
    context={
    'form':form
    }
    return render(request, 'newExpense.html', context)

forms.py

class ExpenseForm(forms.ModelForm):
    class Meta:
        model = Expense
        fields=['category', 'description', 'cost']

На django административный сайт работает нормально, но на моем HTML сайте не работает.

Отображает ошибку:

IntegrityError в / newExpense /

Сбой ограничения NOT NULL: расход_экспонирование.createdBy_id

1 Ответ

0 голосов
/ 12 января 2020

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

if form.is_valid():
    form.save()

должен стать:

if form.is_valid():
    expense = form.save(commit = False)
    expense.createdBy = request.user
    expense.save()

Чтобы кратко объяснить, commit = False останавливает автоматическое сохранение экземпляра новой модели в база данных (когда она сохранена как есть, она нарушает ограничение NOT NULL и, следовательно, выдает ошибку, которую вы видите), но возвращает объект Expense, который будет сохранен. Это позволяет вручную добавить необходимое свойство createdBy и затем сохранить его.

...