简体   繁体   English

如何在Django中显示表单

[英]How to display form in django

I'am little confiused because my code in django does't work and I don't know why. 我有点困惑,因为我在django中的代码不起作用,我也不知道为什么。 I want to create a form displaying in html file. 我想创建一个显示在html文件中的表单。 When I click on thh button, the url have to redirect me in the html file where I've put the form code. 当我单击按钮时,URL必须将我重定向到放置表单代码的html文件中。 But the django return me a error 但是django给我回了一个错误

'User' object has no attribute 'nazwa_set'

My models.py is: 我的models.py是:

from django.db import models
from django.contrib.auth.models import User

class Firma(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name="Użytkownik")
    nazwa = models.CharField(max_length=250,verbose_name='Nazwa firmy', unique=False)

    class Meta:
        verbose_name = 'Firmę'
        verbose_name_plural = 'Firmy'

    def __str__(self):
        return self.nazwa

class Cudzoziemiec(models.Model):
    OBYWATELSTWA = (
        ('RU', 'Rosja'),
        ('UA', 'Ukraina'),
        ('BY', 'Białoruś'),
        )
    TYTUL_POBYTOWY = (
        ('WZ', 'Wiza'),
        ('KP', 'Karta pobytu')
        )

    user = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name="Użytkownik")
    nazwa = models.ForeignKey(Firma, on_delete=models.CASCADE, verbose_name="Firma")
    obywatelstwo = models.CharField(max_length=250,choices=OBYWATELSTWA, verbose_name="Obywatelstwo")
    imie = models.CharField(max_length=80, verbose_name="Imię", unique=False)
    nazwisko = models.CharField(max_length=150, verbose_name="Nazwisko", unique=False)
    data_ur = models.DateField(auto_now=False, auto_now_add=False, verbose_name="Data urodzenia")
    miejsce_ur = models.CharField(max_length=100, verbose_name="Miejsce urodzenia")
    paszport = models.CharField(max_length=30, verbose_name="Paszport")
    data_start_pasz = models.DateField(auto_now=False, auto_now_add=False, verbose_name="Data wydania paszportu")
    data_koniec_pasz = models.DateField(auto_now=False, auto_now_add=False, verbose_name="Data ważności paszportu")
    dok_pobytowy = models.CharField(max_length=250,choices=TYTUL_POBYTOWY, verbose_name="Tytuł pobytowy")
    data_start_pobyt = models.DateField(auto_now=False, auto_now_add=False, verbose_name="Dokument pobytowy ważny od")
    data_koniec_pobyt = models.DateField(auto_now=False, auto_now_add=False, verbose_name="Dokument pobytowy ważny do")

    class Meta:
        verbose_name = 'Cudzoziemca'
        verbose_name_plural = 'Cudzoziemcy'

    def __str__(self):
        return f'{self.imie} {self.nazwisko}'

in the view.py responsible def for adding the new record: view.py负责的def中添加新记录:

@login_required
def nowy_pracownik(request):
    if request.method == "POST":
        nowy_pracownik = CudzoziemiecForm(request.user, request.POST)
        if nowy_pracownik.is_valid():
            nowy_pracownik.save()
            messages.success(request, 'Pomyślnie dodano pracownika !')
            return render(request, 'cudzoziemiec/nowy_pracownik_ok.html')
    else:
        nowy_pracownik = CudzoziemiecForm(request.user)
    return render(request, 'cudzoziemiec/nowy_pracownik.html', {'nowy_pracownik':nowy_pracownik})

And on the end here is my forms.py : 最后是我的forms.py

class FirmaForm(forms.ModelForm):
    class Meta:
        model = Firma
        fields = ('nazwa',)


class CudzoziemiecForm(forms.ModelForm):
    class Meta:
        model = Cudzoziemiec
        fields = ('nazwa','imie', 'nazwisko','obywatelstwo', 'data_ur','paszport', 'data_start_pasz', 'data_koniec_pasz', 'dok_pobytowy', 'data_start_pobyt', 'data_koniec_pobyt')

    def __init__(self, user, *args, **kwargs):            
        super(CudzoziemiecForm, self).__init__(*args, **kwargs)
        self.fields['nazwa'].queryset = user.nazwa_set.all() 
        self.user = user

    def save(self, commit=True):
        instance = super(CudzoziemiecForm, self).save(commit=False)
        instance.user = self.user
        if commit:
            instance.save()
        return instance

The error is probably somewhere in the forms. 错误可能在表格中。 py in the class CudzoziemiecForm in line self.fields['nazwa'].queryset = user.nazwa_set.all() self.fields['nazwa'].queryset = user.nazwa_set.all()行中的self.fields['nazwa'].queryset = user.nazwa_set.all() 类中的 py

In django default reverse lookup name is modelname_set . 在django中,默认反向查找名称是modelname_set So when you trying to get user.nazwa_set.all() this means that there is some model Nazwa related with User . 因此,当您尝试获取user.nazwa_set.all()这意味着存在与User有关的某些Nazwa模型。 Since in your code you don't have model named Nazwa this line raise the error. 由于在您的代码中您没有名为Nazwa模型, Nazwa此行会引发错误。 I suppose you mean Cudzoziemiec or Firma so to fix problem you need to replace user.nazwa_set.all() with user.firma_set.all() in form's __init__ method. 我想您的意思是CudzoziemiecFirma因此要解决此问题,需要在表单的__init__方法user.firma_set.all()替换为user.nazwa_set.all()

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM