Джанго Формсет без начальных данных - PullRequest
0 голосов
/ 30 августа 2018

Я новичок в Django, и я разрабатываю небольшое приложение для регистрации времени (продолжительности) и количества действий на пользователя в день. Вроде как рабочий журнал. Моя проблема заключается в следующем: мой вид «добавить запись» отображает и обновляет старые записи, а не добавляет новые записи в БД Мне нужно представление, чтобы добавить новые записи, а не заменить старые.

Из поиска по IRC-каналу #django я понимаю, что способ набора форм по умолчанию опирается на старые данные, а не настраивает клиента на добавление новых данных. Однако я ничего не нашел о том, как избежать такого поведения, и чтобы клиент предоставил пустую форму для «добавления новых данных» вместо «редактирования существующих данных».

Мой крайний срок подходит к концу, и вся помощь очень ценится.

Вот соответствующие фрагменты кода:

из models.py

class Activity(models.Model):
    name = models.CharField(max_length=200)
    description = models.TextField()

class Workday(models.Model):
    entrydate = models.DateField()
    worker = models.ForeignKey(User, on_delete=models.CASCADE)

class Entry(models.Model):
    duration = models.DurationField()
    quantity = models.PositiveIntegerField()
    activity = models.ForeignKey(Activity, on_delete=models.CASCADE)
    workday = models.ForeignKey(Workday, on_delete=models.CASCADE)

Из форм.py

class EntryForm(ModelForm):
    activity = ModelChoiceField(queryset=Activity.objects.order_by('name'), initial=0)

    class Meta:
        model = Entry
        fields = ['activity',
                  'duration',
                  'quantity',
                  ]

class WorkdayForm(ModelForm):
    class Meta:
        model = Workday
        fields = ['entrydate']
        widgets = {'entrydate': SelectDateWidget}

Из views.py

def addentry(request):
    EntryFormSet = modelformset_factory(Entry, form=EntryForm, extra=0, fields=('activity', 'duration', 'quantity'))

    if request.method == 'POST':
        workdayform = WorkdayForm(request.POST, prefix='workday')
        formset = EntryFormSet(request.POST)

        if formset.is_valid() and workdayform.is_valid():
            # Generate a workday object
            workday = workdayform.save(commit=False)
            workday.entrydate = workdayform.cleaned_data['entrydate']
            workday.worker = request.user
            workday.save()

            # Generate entry objects for each form in the entry formset
            for form in formset:
                e = form.save(commit=False)
                e.workday = workday
                e.save()
                form.save_m2m()

                messages.add_message(request, messages.SUCCESS,
                                     "Registrert aktivitet " +
                                     e.workday.entrydate.strftime('%A %d. %B %Y') +
                                     ": " + e.activity.name + " (" + str(e.quantity) +") - " +
                                     str(e.duration)
                )

            return redirect('index')
        else:
            workdayform = WorkdayForm(request.POST, prefix='workday')
            formset = EntryFormSet(request.POST)

            for dict in formset.errors:
                messages.add_message(request, messages.ERROR, dict)

            context = {
                       'workdayform': workdayform,
                       'formset': formset,
                       }
            return render(request, 'register/addentry.html', context)

    else:
        workdayform = WorkdayForm(prefix='workday')
        formset = EntryFormSet()
        context = {
                   'workdayform': workdayform,
                   'formset': formset,
                   }
        return render(request, 'register/addentry.html', context)

Из addentry.html

{% block content %}
    {% if user.is_authenticated %}

        <h1>Ny dag</h1>
        {% if formset and workdayform %}
            <form id="newdayform" method="POST" class="post-form">
                {% csrf_token %}

                {{ workdayform.as_p }}

                {{ formset.management_form }}

                <table>
                    <thead>
                        <tr>
                            <td>Aktivitet</td>
                            <td>Varighet<br/>(HH:MM:SS)</td>
                            <td>Antall</td>
                        </tr>
                    </thead>
                    <tbody>
                        {%  for form in formset %}
                            <tr>
                                <td>{{ form.activity }}</td>
                                <td>{{ form.duration }}</td>
                                <td>{{ form.quantity }}</td>
                                <td class="hidden">{{ form.id }}</td>
                            </tr>
                        {% endfor %}
                    </tbody>
                </table>
                <button type="submit">Registrer tid</button>
            </form>

               <script src="{% static 'register/jquery.formset.js' %}"></script>
    <script type="text/javascript">
        $(function() {
            $('#newdayform tbody tr').formset();
        })
    </script>

            {% if entryform.errors or workdayform.errors %}
                <h3>Feil i utfyllingen</h3>
                {{ entryform.errors }}
                {{ workdayform.errors }}
            {% endif %}

        {% else %}
            <p>No form!</p>
        {% endif %}

    {% endif %}
{% endblock %}

1 Ответ

0 голосов
/ 30 августа 2018

Благодаря @ e4c5 и этим предыдущим вопросам и ответам проблема решается путем передачи набора запросов без объектов в набор форм, например:

def addentry(request):
    (...)

    qs = Entry.objects.none()
    formset = EntryFormSet(queryset=qs)

   (...)
...