Как заполнить форму Django с помощью тестового клиента - PullRequest
0 голосов
/ 02 мая 2018

Я хотел бы проверить свои формы Django, но я получил эту ошибку

django.core.exceptions.ValidationError: ['ManagementForm data is missing or has been tampered with']

делает это:

 self.client.post(self.url, {"title" : 'title', "status" : 2, "user" :1})

А моей модели нужны только эти поля ...

Спасибо:)

РЕДАКТИРОВАТЬ 1: Вот форма:

class ArticleAdminDisplayable(DisplayableAdmin):

    fieldsets = deepcopy(ArticleAdmin.fieldsets)
    list_display = ('title', 'department', 'publish_date', 'status', )
    exclude = ('related_posts',)
    filter_horizontal = ['categories',]
    inlines = [ArticleImageInline,
               ArticlePersonAutocompleteInlineAdmin,
               ArticleRelatedTitleAdmin,
               DynamicContentArticleInline,
               ArticlePlaylistInline]
    list_filter = [ 'status', 'keywords', 'department', ]

class ArticleAdmin(admin.ModelAdmin):

    model = Article

О модели статьи слишком много наследования, поэтому вы должны доверять мне, единственные поля, необходимые (в зависимости от модели), это название, статус и пользователь.

Ответы [ 2 ]

0 голосов
/ 04 мая 2018

Хорошо, поэтому, судя по вашим form, у вас есть много плагинов django, которые вы используете. Я должен был попросить у вас полный test, но я думаю, что мог бы понять, где возникнет какая-то проблема.

Когда вы self.client.post, вы действительно проверяете view, а не обязательно форму. {"title" : 'title', "status" : 2, "user" :1} - это 3 значения, которые ваш client равен post ing.

Input Field : Data(Value of the Field)
title       :'title'  # A string
status      : 2       # The number 2
user        : 1       # The number 1

Вот некоторый тестовый код, который работал для меня. Надеюсь, это поможет вам.

forms.py

from .models import CustomerEmployeeName


class EmployeeNameForm(ModelForm):

    class Meta:
        model = CustomerEmployeeName
        fields = [
            'employee_choices',
            'first_name',
            'middle_name',
            'last_name',
            ]

test_forms.py

from django.test import TestCase

from .forms import EmployeeNameForm

class TestEmployeeNameForm(TestCase):
    """
    TESTS: form.is_valid
    """
    # form.is_valid=True
    # middle_name not required.
    # middle_name is blank.
    def test_form_valid_middle_optional_blank(self):
        name_form_data = {'first_name': 'First',     # Required
                            'middle_name': '',       # Optional
                            'last_name': 'Last',     # Required
                            'employee_choices': 'E', # Required
                        }
        name_form = EmployeeNameForm(data=name_form_data)

        self.assertTrue(name_form.is_valid())

view.py

from .forms import EmployeeNameForm

def create_employee_profile(request):

    if request.POST:
        name_form = EmployeeNameForm(request.POST)

        if name_form.is_valid():
            new_name_form = name_form.save()
            return redirect(new_name_form) #get_absolute_url set on model

        else:
            return render(request,
                'service/template_create_employee_profile.html',
                    {'name_form': name_form}
                    )

    else:
        name_form = EmployeeNameForm(
                        initial={'employee_choices': 'E'}
                        )
        return render(request,
                'service/template_create_employee_profile.html',
                {'name_form': name_form}
                )

test_views.py

from django.test import TestCase, Client

from service.models import CustomerEmployeeName

class TestCreateEmployeeProfileView(TestCase):
    # TEST: View saves valid object.
    def test_CreateEmployeeProfileView_saves_valid_object(self):
        response = self.client.post(
            '/service/', {
                    'first_name': 'Test',        # Required
                    'middile_name': 'Testy',     # Optional
                    'last_name': 'Testman',      # Required
                    'employee_choices': 'E',     # Required
                    })

        self.assertTrue(CustomerEmployeeName.objects.filter(
            first_name='Test').exists())

Если вы хотите опубликовать больше своего кода, я с удовольствием его посмотрю.

0 голосов
/ 02 мая 2018

Formsets должны иметь свои ManagementForm.

Взгляните на этот сайт и этот пост , чтобы указать вам правильное направление.

...