如何以自定义形式使用Wagtail的管理小部件?

问题描述

我真的很想在我的自定义模板中重复使用用Wagtail制作的网站管理部分中使用的相同小部件。有一个简单的方法吗?

例如:Picture of a field in wagtail's admin

在我的html模板中使用时将如下所示:Same field but in my view

我的模型当前看起来像这样:

import java.awt.Basicstroke;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.RenderingHints;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class Ripples implements Runnable {

    public static void main(String[] args) {
        SwingUtilities.invokelater(new Ripples());
    }

    private Animation animation;

    private DrawingPanel drawingPanel;

    private RipplesModel model;

    public Ripples() {
        model = new RipplesModel();
    }

    @Override
    public void run() {
        JFrame frame = new JFrame("Ripples");
        frame.setDefaultCloSEOperation(JFrame.DO_nothing_ON_CLOSE);
        frame.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent event) {
                stopAnimation();
                frame.dispose();
                System.exit(0);
            }
        });

        drawingPanel = new DrawingPanel(model);
        frame.add(drawingPanel,BorderLayout.CENTER);

        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);

        animation = new Animation(this,model);
        new Thread(animation).start();
    }

    public void repaint() {
        drawingPanel.repaint();
    }

    private void stopAnimation() {
        if (animation != null) {
            animation.setRunning(false);
        }
    }

    public class DrawingPanel extends JPanel {

        private static final long serialVersionUID = 1L;

        private RipplesModel model;

        public DrawingPanel(RipplesModel model) {
            this.model = model;
            setBackground(Color.WHITE);
            setPreferredSize(new Dimension(500,500));
            addMouseListener(new RipplesListener(model));
        }

        @Override
        public void paintComponent(Graphics g) {
            super.paintComponent(g);

            Graphics2D g2 = (Graphics2D) g;
            g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
            g2.setstroke(new Basicstroke(3f));

            List<Circle> circles = model.getCircles();
            for (Circle circle : circles) {
                Point p = circle.getCenter();
                int radius = circle.geTradius();
                g2.setColor(circle.getColor());
                g2.drawoval(p.x - radius,p.y - radius,2 * radius,2 * radius);
            }
        }

    }

    public class RipplesListener extends MouseAdapter {

        private RipplesModel model;

        public RipplesListener(RipplesModel model) {
            this.model = model;
        }

        @Override
        public void mousepressed(MouseEvent event) {
            model.addCircle(new Circle(event.getPoint(),createColor()));
        }

        private Color createColor() {
            Random random = new Random();
            int r = random.nextInt(255);
            int g = random.nextInt(255);
            int b = random.nextInt(255);
            return new Color(r,g,b);
        }
    }

    public class Animation implements Runnable {

        private volatile boolean running;

        private Ripples frame;

        private RipplesModel model;

        public Animation(Ripples frame,RipplesModel model) {
            this.frame = frame;
            this.model = model;
            this.running = true;
        }

        @Override
        public void run() {
            while (running) {
                sleep(20L);
                incremenTradius();
            }
        }

        private void incremenTradius() {
            List<Circle> circles = model.getCircles();
            for (Circle circle : circles) {
                circle.incremenTradius();
            }
            repaint();
        }

        private void sleep(long delay) {
            try {
                Thread.sleep(delay);
            } catch (InterruptedException e) {
                e.printstacktrace();
            }
        }

        private void repaint() {
            SwingUtilities.invokelater(new Runnable() {
                @Override
                public void run() {
                    frame.repaint();
                }
            });
        }

        public synchronized void setRunning(boolean running) {
            this.running = running;
        }

    }

    public class RipplesModel {

        private List<Circle> circles;

        public RipplesModel() {
            this.circles = new ArrayList<>();
        }

        public void addCircle(Circle circle) {
            this.circles.add(circle);
        }

        public List<Circle> getCircles() {
            return circles;
        }

    }

    public class Circle {

        private int radius;

        private final Color color;

        private final Point center;

        public Circle(Point center,Color color) {
            this.center = center;
            this.color = color;
            this.radius = 10;
        }

        public void incremenTradius() {
            radius = (++radius > 200) ? 10 : radius;
        }

        public Color getColor() {
            return color;
        }

        public int geTradius() {
            return radius;
        }

        public Point getCenter() {
            return center;
        }

    }

}

我的表格是这样的:

@slugify_field('name')
class Company(models.Model):
    # more CharFields that I erased for brevity
    address = models.CharField(
        blank=True,max_length=255,help_text="The company's address.",)
    founded = models.DateField(
        blank=True,null=True,help_text='The foundation year.',)
    short_description = models.TextField(
        blank=True,help_text='A short description for the search view.',)
    description = RichTextField(
        blank=True,help_text='A complete description for the company view.',features=['h4','bold','ul','link']
    )
    website = models.TextField(
        blank=True,help_text="The company main website",)

    panels = [
        FieldPanel('status'),FieldPanel('owner'),FieldPanel('name'),MapFieldPanel('address'),FieldPanel('founded'),FieldPanel('employees_count'),FieldPanel('contact',widget=autocomplete.ModelSelect2(url='contact-autocomplete')),FieldPanel('short_description'),FieldPanel('description'),FieldPanel('website'),FieldPanel('tags',widget=autocomplete.ModelSelect2Multiple(url='unseekable-tag-autocomplete')),FieldPanel('seeking',widget=autocomplete.ModelSelect2Multiple(url='seekable-tag-autocomplete')),FieldPanel('offering',]

    def __str__(self):
        return self.name

    class Meta:
        verbose_name = 'Company'
        verbose_name_plural = 'Companies'

由于每个用户都可以修改自己的公司,所以我做了一个很好的视图,使他们可以编辑自己的信息,唯一的问题是,这些字段看上去与网站的管理员部分(由wagtail自动创建)不同。我可以将fieldPanels用作我的“表单”页面的小部件吗?

非常感谢。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)