Как изменить форму при ее возврате?

avatar
Rebecca
1 июля 2021 в 21:21
86
1
-1

Я хочу изменить форму от пользователя и вернуть эту другую форму в django, однако я пробовал много разных способов, все в views.py, в том числе:

  1. Напрямую изменить его, выполнив str(form) += "modification"
  2. возврат новой формы пользователем newform = str(form) + "modification"
  3. создание другого поста в моделях, но потом я понял, что это не сработает, потому что мне нужен только один пост

Все вышеперечисленное привело к ошибкам, таким как SyntaxError: can't assign to function call, TypeError: join() argument must be str or bytes, not 'HttpResponseRedirect', AttributeError: 'str' object has no attribute 'save', а также к другой ошибке авторизации, в которой говорилось, что я не могу изменить форму или что-то в этом роде.

Вот фрагмент из views.py:

class PostCreateView(LoginRequiredMixin, CreateView):
    model = Post
    fields = ['content']
    title = ['title']   #
    template_name = 'blog/post_new.html'
    success_url = '/'

    def form_valid(self, form):
        #debugging 
        tempvar = (str(form).split('required id="id_content">'))[1].split('</textarea></td>')[0]  #url
        r = requests.get(tempvar)
        tree = fromstring(r.content)
        title = tree.findtext('.//title')
        print(title)

        form.instance.author = self.request.user
        if "http://" in str(form).lower() or "https://" in str(form).lower():
            if tempvar.endswith(' '):   
                return super().form_valid(form)
            elif " http" in tempvar:   
                return super().form_valid(form)
            elif ' ' not in tempvar:
                return super().form_valid(form)
            else:
                return None

models.py:

class Post(models.Model):
    content = models.TextField(max_length=1000)
    title = models.TextField(max_length=500, default='SOME STRING')  #

    date_posted = models.DateTimeField(default=timezone.now)
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    likes= models.IntegerField(default=0)
    dislikes= models.IntegerField(default=0)

    def __str__(self):
        return (self.content[:5], self.title[:5]) #

    @property
    def number_of_comments(self):
        return Comment.objects.filter(post_connected=self).count()

И в home.html, где должен отображаться пост (вместе с заголовком и содержанием):

                    <a
                            style="color: rgba(255, 255, 255, 0.5) !important;"
                            href="{% url 'post-detail' post.id %}">
                        <p class="mb-4">
                            {{ post.content }}
                            {{ post.title }}  #
                        </p>
                    </a>

Исходный шаблон, который я изменяю, можно найти здесь.

Большое спасибо за помощь, буду очень рад любому совету!!

Ps: я использую Python 3.7.4

Источник
damon
1 июля 2021 в 22:45
0

form — это объект формы модели django, и он не обрабатывается как str. Можете ли вы объяснить в своем вопросе, каким будет желаемый результат? Без него трудно сформировать полезный ответ.

Rebecca
1 июля 2021 в 23:46
0

@damon Вместо того, чтобы просто публиковать ссылку/контент, я хочу автоматически получать заголовок статьи, а также отображать его как заголовок. К сожалению, я не знаю, как добавить заголовок в форму, чтобы он отображался... :(

Ответы (1)

avatar
Danny
2 июля 2021 в 02:50
0

Создайте файл forms.py внутри приложения, о котором вы говорите, он должен выглядеть так:

from django import forms
from . import models

class YourFormName(forms.ModelForm):
  class Meta:
    model = models.your_model_name
    fields = ['field1', 'field2' ,...] # Here you write the fields of your model, this fields will appear on the form where user post data

Затем вы вызываете эту форму в своем views.py, чтобы Django мог отобразить ее в вашем шаблоне, например:

def your_view(request, *args, **kwargs):
    if request.method == 'POST':
        form = forms.YourFormName(request.POST, request.FILES)
        if form.is_valid():
            instance = form.save(commit=False)
            instance.user= request.user
            instance.save()
            return redirect('template.html') # To redirect if the form is valid
    else:
        form = forms.YourFormName()
    return render(request, "template.html", {'form': form}) # The template if the form is not valid

И последнее, что нужно сделать, это создать template.html:

{% extends 'base.html' %}

{% block content %}

    <form action="{% url 'the_url_that_renders_this_template' %}" method='POST' enctype="multipart/form-data">
        {% csrf_token %}
        {{ form }}
        <button type="submit">Submit</button>
    </form>

{% endblock content %}

Если вы хотите получить данные из БД, представленные в этой форме, вы делаете это с помощью новой функции в views.py:

def show_items(request, *args, **kwargs):
    data = YourModelName.objects.all()
    context = {
        "data": data
    }
    return render(request, "show_items.html", context)

Затем в show_items.html:

{% extends 'base.html' %}
{% block content %}

{% for item in data %}

{{item.field1}}
{{item.field2}}
...
{{The items you want to show in that template}}

{% enfor %}

{% endblock content %}

Это то, что ты хотел сделать? Если нет, добавьте дополнительное объяснение того, что на самом деле вы хотите сделать

Rebecca
2 июля 2021 в 04:14
0

Большое спасибо!! Просто чтобы уточнить, этот код позволяет мне изменять ввод пользователя, верно? (например, разрешить мне принимать пользовательский ввод формы, добавлять динамический текст к пользовательскому вводу и отображать пользовательский ввод вместе с добавленным текстом)

Danny
2 июля 2021 в 05:06
0

Что вы подразумеваете под добавлением динамического текста? Пример может помочь мне понять, что вы на самом деле хотите

Rebecca
2 июля 2021 в 14:45
0

Итак, вы знаете, как твиттер отображает название статей, когда вы связываете их? Я хочу сделать это, если пользователь отправляет ссылку в качестве «контента», я добавляю заголовок статьи со ссылкой. Я уже написал ручную часть этого в views.py, однако мне просто было интересно, как вернуть этот проанализированный заголовок в шаблон.

Danny
3 июля 2021 в 20:53
0

Я думаю, вы можете вызвать объект в шаблоне, например {{ obj.link }}, и с помощью какого-то JS или даже тега HTML вы сможете проанализировать ссылку и отобразить текст на основе этой ссылки, но я не думаю, что это должен иметь дело с самим Джанго

Rebecca
4 июля 2021 в 16:54
0

Огромное спасибо!! Я не очень уверен, как сделать тег JS или HTML ... не могли бы вы связать меня с несколькими ресурсами или отредактировать свой ответ? Также вы уверены, что он совместим с запросами (может импортировать модули)?