Django - ForeignKey - CharField -> must be a instance...

28 views
Skip to first unread message

Kamil Mroczkowski

unread,
Jan 10, 2017, 8:45:22 AM1/10/17
to django-pl - grupa polskiej społeczności Django
Witam,

chciałbym w Django zrobić w dodaniu rekordu wyszukiwanie danych powiązanych i wybranie ich (i to mi działa), a jak nie istnieją to stworzenie ich. Np mam model:

models.py:

class Kontrahent(models.Model):
    nazwa = models.CharField(max_length=32)

    def __str__(self):
        return self.nazwa

class Zlecenie(models.Model):
    nrZleceniaKlienta = models.CharField('Nr zlecenia klienta', max_length=64, blank=True)
    dataPrzyjeciaZlecenia = models.DateField('Data przyjęcia zlecenia', error_messages=my_default_errors)
    klientGrupy = models.ForeignKey(Kontrahent, null=True, related_name='%(class)s_klient_grupy', verbose_name='Klient grupy:')

forms.py:

class ZlecenieForm(forms.ModelForm):
    klientGrupy = forms.CharField(max_length=32)

    class Meta:
        model = Zlecenie
        fields = ['nrZleceniaKlienta', 'dataPrzyjeciaZlecenia', 'klientGrupy']

views.py:

def ZlecenieAdd(request):
    if request.method == 'POST':
        form = ZlecenieForm(request.POST)
        if form.is_valid():
            klientGrupy, created = Kontrahent.objects.get_or_create(nazwa=form.cleaned_data['klientGrupy'])
            zlecenie = form.save(commit=False)
            zlecenie.klientGrupy = klientGrupy
            zlecenie.save()
    else:
        form = ZlecenieForm()
    context = { "form": form, }
    return render(request, 'zlecenia/zlecenie_form.html', context)

zlecenie_form:

{% extends 'zlecenia/base.html' %}

{% block styles %}
<script>
    $("#id_klientGrupy").autocomplete({
        source: "/api/kontrahent/",
        minLength: 2,
    });
</script>
{% endblock %}

{% block body %}
<form action="" method="post" enctype="multipart/form-data">
{% csrf_token %}
{% for field in form %}
    {{ field.label_tag }}&nbsp;{{ field }}<br />
{% endfor %}
    <button type="submit">Zapisz</button>
</form>
{% endblock %}

^^^ aktualnie wywala się na form.is_valid(): Cannot assign "'XYZ'": "Zlecenie.klientGrupy" must be a "Kontrahent" instance.

ps: googlam już 3 dzień i testowałem wiele przykładów, ale zawsze się wywala na is_valid() ;)

Bartłomiej Opajdowski

unread,
Jan 10, 2017, 10:44:40 AM1/10/17
to djan...@googlegroups.com
użyj select2 do wyszukiwania klienta i w formie daj ForeignKey (właściwie wtedy pola nie musisz dodawać) . Do tego przypisania Kontrahent get or create nigdy Ci nie dochodzi i wywala się na walidacji formy, bo forma chce z modeli klientGrupy jako instancję kontrahenta, a dostaje ciąg znaków (zamiast ID) 

--
Otrzymujesz tę wiadomość, bo subskrybujesz grupę „django-pl - grupa polskiej społeczności Django” w Grupach dyskusyjnych Google.
Aby anulować subskrypcję tej grupy i przestać otrzymywać od niej wiadomości, wyślij e-maila na django-pl+unsubscribe@googlegroups.com.
Aby opublikować wpis w tej grupie, wyślij e-maila na djan...@googlegroups.com.
Otwórz tę grupę na https://groups.google.com/group/django-pl.
Więcej opcji znajdziesz na https://groups.google.com/d/optout.



--
pozdrawiam
Bartłomiej Opajdowski

Paul Trojanowski

unread,
Jan 10, 2017, 10:56:31 AM1/10/17
to djan...@googlegroups.com
Zrób tak jak proponuje Bartłomiej, ewentualnie http://wklej.org/hash/fa30018c23a/
Reply all
Reply to author
Forward
0 new messages