Django передает данные из DetailView в скрытые входы FormView - PullRequest
0 голосов
/ 01 апреля 2019

Я пробовал несколько статей о StackOverflow, и ни одна из них, похоже, не отвечает на мой вопрос. Я относительно новичок в этом, так что я уверен, что мне просто не хватает чего-то простого. У меня есть DetailView, который имеет кнопку. Когда пользователь нажимает кнопку, я хочу, чтобы она передавала 2 значения полей в скрытые поля ввода FormViews. Я просто не знаю с чего начать. Вот мой код:

views.py

class RequestInfoView(CreateView):
    template_name = 'request_info.html'
    form_class = RequestInfoForm
    success_url = '/thanks/'

    def form_valid(self, form):
        name = form.cleaned_data['name']
        email = form.cleaned_data['email']
        phone = form.cleaned_data['phone']
        state = form.cleaned_data['state']
        vendor = form.cleaned_data['vendor']
        product_name = form.cleaned_data['product']

        message = name + " " + email + " " + state + " " + str(product_name)

        html_message = render_to_string('mail_request.html', context=({'name': name,
                                                                       'email': email,
                                                                       'phone': phone,
                                                                       'state': state,
                                                                       'product': product_name}))
        try:
            send_mail('Sales Inquiry from: ' + name, message, email, ['test@example.com'],
                      html_message=html_message)
        except BadHeaderError:
            return HttpResponse('Invalid header found.')
        return super().form_valid(form)

class ProductDetailView(DetailView):
    context_object_name = 'product_detail'
    model = Product
    queryset = Product.objects.all()
    template_name = 'product_details.html'

    def get_context_data(self, **kwargs):
        context = super(ProductDetailView, self).get_context_data(**kwargs)
        context['image'] = ProductImage.objects.all()
        return context

forms.py

class RequestInfoForm(forms.ModelForm):
    state = forms.CharField(widget=forms.Select(choices=STATE_CHOICES, attrs={
        'class': 'form-control select2',
        'style': 'width:100%;'
    }))
    vendor = forms.CharField(widget=forms.HiddenInput(), required=True)
    product = forms.CharField(widget=forms.HiddenInput(), required=True)

    class Meta:
        model = InfoRequest
        fields = ['name', 'email', 'phone', 'state', 'vendor', 'product']

urls.py

path('product/<slug>', ProductDetailView.as_view(), name='product_detail'),
path('request/', RequestInfoView.as_view(), name='request'),

шаблон из детального вида

<div class="action">
                            <a href="{% url 'boatsales:request' %}"><button class="btn-a btn-a_size_small btn-a_color_theme" type="button">Request Info from
                                Manufacturer</a>
                            </button>

временный шаблон для запросов

<form action="{% url 'boatsales:request' %}" method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">GO</button>
</form>

models.py

class Product(models.Model):
    product_model = models.CharField(max_length=100)
    vendor = models.ForeignKey(Vendor, on_delete=models.CASCADE)
    slug = models.SlugField(max_length=200, unique=True, null=True)
    length = models.CharField(max_length=50)
    length_range = models.ForeignKey(LengthRange, on_delete=models.SET_NULL, null=True, blank=True)
    hull_type = models.ForeignKey(Hull, on_delete=models.SET_NULL, null=True, blank=True)
    max_beam = models.CharField(max_length=50, blank=True, default='0')
    cockpit_length = models.CharField(max_length=50, blank=True, default='0')
    cockpit_beam = models.CharField(max_length=50, blank=True, default='0')
    price = models.DecimalField(decimal_places=2, max_digits=50)
    power = models.ForeignKey(PowerConfiguration, on_delete=models.SET_NULL, null=True, blank=True)
    average_bare_hull_weight = models.CharField(max_length=50, blank=True, default='0')
    fuel_capacity_gallons = models.CharField(max_length=50, blank=True, default='0')
    seating_capacity = models.ForeignKey(Seat, on_delete=models.SET_NULL, null=True, blank=True)
    speed = models.ForeignKey(SpeedRange, on_delete=models.SET_NULL, null=True, blank=True)
    warranty = models.CharField(max_length=256, default='None')
    hull_only_available = models.BooleanField(blank=False, default=False)
    description = models.TextField()
    featured = models.BooleanField(blank=False, default=False)

    class Meta:
        ordering = ['product_model']

    def __str__(self):
        return '{} {}'.format(self.vendor, self.product_model)

    def save(self, *args, **kwargs):
        # just check if product_model or vendor.name has changed
        self.slug = '-'.join((slugify(self.vendor.name), slugify(self.product_model)))
        super(Product, self).save(*args, **kwargs)

1 Ответ

0 голосов
/ 01 апреля 2019

Для начала необходимо передать продукт в представление запроса.Есть несколько вариантов: изменить URL-адрес на request/<slug> или включить его в строку запроса, например, request?slug=<slug>.

Затем вы можете переопределить get_initial и вернуть словарь с product_name иvendor ключи для скрытых полей.Тем не менее, возможно, будет удобнее удалить эти поля из формы и извлечь их из URL.

def form_valid(self, form):
    # Fetch slug if URL is /request/<slug>/
    product = get_object_or_404(Product, slug=self.kwargs['slug']
    # Fetch product from querystring
    product = get_object_or_404(Product, slug=self.request.GET['slug']
    ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...