Django формирует динамический выпадающий список - PullRequest
0 голосов
/ 07 июня 2018

models.py

Создайте свои модели здесь.

class DeviceType(models.Model):
    device_type = models.CharField(max_length=200,unique=True)

class Repair(models.Model):
    device_type                     = models.ForeignKey(DeviceType,to_field='device_type')
    submitted_by                    = models.ForeignKey(User,to_field='username')
    comments                        = models.TextField()
    repair_request_date             = models.DateField(default=datetime.now)
    repair_status                   = models.ForeignKey(RepairStatus, to_field="repair_status", null=True)
    repair_cost_estimate            = models.FloatField(null=True)

views.py

def repair_form(request):
    dlist = get_my_choices(request.user)
    if request.method == "POST":
        form = RepairForm(request.POST,device_type = dlist, submitted_by = request.user)
        #print(form)
        if form.is_valid():
            print("Inside repair form")
            post = form.save(commit=False)
            post.submitted_by = request.user
            print(post.pk)
            post.save()
            return redirect("RepairRequest")
    else:
        dlist = get_my_choices(request.user)
        print("Inside else of repair form")
        form = RepairForm( device_type = dlist, submitted_by = request.user)
        print("else form: ", form)
        return render(request, "Form_template.html", {"form": form,\
                                                      "name": "Repair Request Form"})

forms.py

class RepairForm(forms.ModelForm):

    def __init__(self, *args, **kwargs):
        print("kwargs: ",kwargs)
        dlist = kwargs["device_type"]
        print("Inside init of RequestForm")
        super(RepairForm, self).__init__(*args, **kwargs)
        self.fields["device_type"] = forms.ChoiceField(choice = [dlist])
        self.fields["submitted_by"] = kwargs["submitted_by"]



    class Meta:
        print("Inside Meta of RepairForm")
        model = Repair
        print("model: ", model)
        fields = "__all__"
        print("fields: ", fields)
        exclude = ("repair_cost_estimate","repair_status","submitted_by","repair_request_date",)

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

TypeError at /user_dashboard/RepairRequest.html
__init__() got an unexpected keyword argument 'submitted_by'
Request Method: GET
Request URL:    http://127.0.0.1:8000/user_dashboard/RepairRequest.html
Django Version: 1.11.13
Exception Type: TypeError
Exception Value:    
__init__() got an unexpected keyword argument 'submitted_by'
Exception Location: E:\inventory management\inventory_management_service\inventory_management_app\forms.py in __init__, line 15
Python Executable:  C:\Anaconda2\python.exe
Python Version: 2.7.14
Python Path:    
['E:\\inventory management\\inventory_management_service',
 'C:\\Anaconda2\\python27.zip',
 'C:\\Anaconda2\\DLLs',
 'C:\\Anaconda2\\lib',
 'C:\\Anaconda2\\lib\\plat-win',
 'C:\\Anaconda2\\lib\\lib-tk',
 'C:\\Anaconda2',
 'C:\\Users\\Jaimik Jain\\AppData\\Roaming\\Python\\Python27\\site-packages',
 'C:\\Anaconda2\\lib\\site-packages',
 'C:\\Anaconda2\\lib\\site-packages\\win32',
 'C:\\Anaconda2\\lib\\site-packages\\win32\\lib',
 'C:\\Anaconda2\\lib\\site-packages\\Pythonwin',
 'C:\\Anaconda2\\lib\\site-packages\\pywinpty-0.5-py2.7-win-amd64.egg']
Server time:    Thu, 7 Jun 2018 09:56:44 +0000

Я прошу вашей помощи в ближайшее время.

Ответы [ 2 ]

0 голосов
/ 07 июня 2018

Как выглядит ваша ремонтная модель?

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

form = RepairForm()
form.fields['device_type'].queryset = MyDeviceModel.objects.filter(user=request.user)

Обратите внимание, что при вызове RepairForm() также нет необходимости передавать submit_by - поле исключено в самой форме, и вы уже обрабатываете заполнение поля submitted_by в вашем if form.is_valid() блок, так что я не думаю, что это что-то делает.

РЕДАКТИРОВАТЬ

views.py

def repair_form(request):
    if request.method == "POST":
        form = RepairForm(request.POST)
        if form.is_valid():
            post = form.save(commit=False)
            post.submitted_by = request.user
            post.save()
            return redirect("RepairRequest")
    else:
       form = RepairForm()
       form.fields['device_type'].queryset = DeviceType.objects.filter(user=request.user)

       return render(request, "Form_template.html", {"form": form, "name": "Repair Request Form"})

forms.py

class RepairForm(forms.ModelForm):

   class Meta:
      model = Repair
      exclude = ( "repair_cost_estimate","repair_status","submitted_by","repair_request_date",)
0 голосов
/ 07 июня 2018

Проблема в том, что вы передаете здесь параметры submitted_by и device_type в конструктор RepairForm.Поскольку вы упоминаете их явно, это означает, что они хранятся в словаре kwargs.

Однако вы не изменяете этот словарь перед выполнением вызова super().__init__(*args, **kwargs).В результате суперкласс (ModelForm) также получит эти параметры, но он не понимает, как обрабатывать эти параметры.В результате произойдет ошибка.

Таким образом, вам необходимо удалить эти параметры из kwargs.Например, с .pop(..):

class RepairForm(forms.ModelForm):

    def __init__(self, *args, **kwargs):
        dlist = kwargs<b>.pop("device_type")</b>
        <b>submitted_by = kwargs.pop("submitted_by")</b>
        super(RepairForm, self).__init__(*args, **kwargs)
        self.fields["device_type"] = forms.ChoiceField(<b>choices=[dlist]</b>)
        self.fields["submitted_by"] = <b>submitted_by</b>

Вы также должны использовать choices=... в качестве параметра при инициализации ChoiceField вместо choice=....

Я думаю, что есть несколько дополнительных ошибок, но я надеюсь, что это дает хорошие указания.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...