Как создать форму для работы с несколькими django объектами модели - PullRequest
0 голосов
/ 05 мая 2020

Итак, у меня есть модель сообщения со следующим определением:

class Post(models.Model):
    post_body = models.TextField()
    user = models.ForeignKey(
        to=User,
        on_delete=models.CASCADE
    )
    published = models.BooleanField(
        default=False
    )
    schedule = models.DateTimeField(
        default=timezone.now
    )

Я создал форму в шаблоне HTML, позволяющую пользователю выбирать сообщения, которые он хочет отправить на другой веб-сайт или в социальную сеть. учетная запись. Примерно так:

<form>
    <table class="table table-hover">
        <thead>
        <tr>
            <th scope="col">Select</th>
            <th scope="col">Post Body</th>
            <th scope="col">Published?</th>
            <th scope="col">Schedule (Editable)</th>
        </tr>
        </thead>
        <tbody>
        {% for post in posts %}
            <tr>
                <td>
                    <div class="form-group">
                        <input type="checkbox" value="{{ post.id }}">
                    </div>
                </td>
                <td>{{ post.post_body }}</td>
                <td>{{ post.published }}</td>
                <td>
                    <div class="form-group">
                        <input type="datetime-local" class="form-control" name="schedule" value="{{ post.schedule|date:"Y-m-d\TH:i" }}">
                    </div>
                </td>
            </tr>
        {% endfor %}
        </tbody>
    </table>
    <button class="btn btn-primary" type="submit">Post</button>
</form>

Я хочу создать форму в forms.py, чтобы обрабатывать эту информацию (т.е. знать, какие все сообщения были выбраны), а затем выполнять дальнейшие действия (вызов других API-интерфейсов, чтобы publi sh их на другие сайты), также, поскольку расписание полей можно редактировать, я хочу сохранить и его. Пожалуйста, помогите, так как я не могу придумать для этого возможную форму.

Ответы [ 3 ]

1 голос
/ 13 мая 2020

Один из способов решить эту проблему - использовать ModelMultipleChoiceField

Вот структура, которую я использовал для аналогичного сценария ios:

class SelectPostsForm(forms.Form):
    posts = forms.ModelMultipleChoiceField(
        queryset=Post.objects.none(), widget=forms.CheckboxSelectMultiple)

    def __init__(self, filtered_post_queryset, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['posts'].queryset = filtered_post_queryset

    def get_posts(self):
        return self.cleaned_data.get('posts')


    # Example usage
    form = SelectPostsForm(Post.objects.all(), data=request.data)
    if form.is_valid():
       selected_posts = form.get_posts()
       # Process posts...

Это будет вероятно, работать напрямую с кодом html, который вы показали, если вы добавите name = "posts" на вход.

«Filter_post_queryset», который вы можете предоставить через представление, если вам нужно сделать это на отфильтрованных / ограниченных queryset. Затем данные будут правильно проверены с помощью form.is_valid() по отфильтрованному набору запросов.

1 голос
/ 09 мая 2020

Если вы хотите обрабатывать несколько объектов одного типа с помощью форм, вам следует попробовать с formsets - https://docs.djangoproject.com/en/3.0/topics/forms/formsets/

Есть много других вариантов, но я думаю, что этот набор форм удовлетворит ваши потребности.

РЕДАКТИРОВАТЬ: Пожалуйста, используйте его только как руководство:

# forms.py


class PostForm(forms.ModelForm):
    is_selected = forms.BooleanField(default=False)

    class Meta:
        model = Post
        fields = ("is_selected", "other", "model" "fields")


PostFormSet = modelformset_factory(Post, form=PostForm)
# views.py

class PostView(generic.View):
    def get(self, request, *args, **kwargs):
        posts = Post.objects.all()  # get your Post queryset
        formset = PostFormSet(queryset=posts)
        # ...
        return response

    def post(self, request, *args, **kwargs):
        formset = PostFormSet(request.POST)
        for form in formset.forms:
            if form.is_valid() and form.cleaned_data.get("is_selected"):
                # here you can save your instance and/or write logic 
                # to process gathered information
        # ...
        return response  

0 голосов
/ 10 мая 2020

Вы хотите, чтобы все ваши «сообщения» отображались с помощью «одной формы ()», а затем управляли выбранными сообщениями. Наборы форм используются для этого в django. Хотя существует множество типов, но любой простой набор форм поможет вам выполнить работу.

Пожалуйста, посетите django документацию для реализации: https://docs.djangoproject.com/en/3.0/topics/forms/formsets/

Для быстрого и легкого понимания посетите это: https://www.geeksforgeeks.org/django-formsets/

...